//
//  NotificationService.swift
//  Notifications
//
//  Created by Salvatore Giordano on 25/03/2020.
//  Copyright © 2020 The Chromium Authors. All rights reserved.
//

import UserNotifications
//import StreamChatClient

final class NotificationService: UNNotificationServiceExtension {
    
    var contentHandler: ((UNNotificationContent) -> Void)?
    var bestAttemptContent: UNMutableNotificationContent?
    
    override func didReceive(_ request: UNNotificationRequest, withContentHandler contentHandler: @escaping (UNNotificationContent) -> Void) {
        self.contentHandler = contentHandler
        bestAttemptContent = (request.content.mutableCopy() as? UNMutableNotificationContent)
        
        guard let sharedDefaults = UserDefaults(suiteName: "group.io.getstream.flutter"),
            let apiKey = sharedDefaults.string(forKey: "KEY_API_KEY"),
            let userId = sharedDefaults.string(forKey: "KEY_USER_ID"),
            let token = sharedDefaults.string(forKey: "KEY_TOKEN"),
            let messageId = bestAttemptContent?.userInfo["message_id"] as? String else {
                return
        }
        
//        Client.config = .init(apiKey: apiKey, logOptions: .error)
//        Client.shared.set(user: User(id: userId), token: token) { res in
//            guard res.isConnected else {
//                return
//            }
//
//            Client.shared.message(withId: messageId) { [weak self] res in
//                if let message = res.value?.message,
//                    let channel = res.value?.channel {
//                    let messageWrapper = MessageWrapper(channel: channel, message: message)
//                    if let encodedData = try? JSONEncoder.stream.encode(messageWrapper),
//                        let encodedString = String(data: encodedData, encoding: .utf8) {
//                        let storedMessages = sharedDefaults.stringArray(forKey: "messageQueue") ?? []
//                        sharedDefaults.setValue(storedMessages + [encodedString], forKey: "messageQueue")
//
//                        // Modify the notification content here...
//                        self?.bestAttemptContent?.title = "[modified] \(self?.bestAttemptContent?.title ?? "<NoContent>")"
//                        contentHandler(self?.bestAttemptContent ?? request.content)
//                    }
//                    Client.shared.disconnect()
//                }
//            }
//        }
    }
    
    override func serviceExtensionTimeWillExpire() {
        if let contentHandler = contentHandler, let bestAttemptContent =  bestAttemptContent {
            contentHandler(bestAttemptContent)
        }
    }
}

//public struct MessageWrapper: Encodable {
//    private enum CodingKeys: String, CodingKey {
//        case id
//        case channel
//        case type
//        case user
//        case created = "created_at"
//        case updated = "updated_at"
//        case text
//        case command
//        case args
//        case attachments
//        case parentId = "parent_id"
//        case showReplyInChannel = "show_in_channel"
//        case mentionedUsers = "mentioned_users"
//    }
//
//    init(channel: Channel, message: Message) {
//        id = message.id
//        type = message.type
//        user = message.user
//        created = message.created
//        updated = message.updated
//        text = message.text
//        command = message.command
//        args = message.args
//        attachments = message.attachments
//        parentId = message.parentId
//        showReplyInChannel = message.showReplyInChannel
//        mentionedUsers = message.mentionedUsers
//        extraData = message.extraData
//        self.channel = ChannelWrapper(channel: channel)
//    }
//
//    /// A message id.
//    public let id: String
//    /// The channel cid.
//    public let channel: ChannelWrapper?
//    /// A message type (see `MessageType`).
//    public let type: MessageType
//    /// A user (see `User`).
//    public let user: User
//    /// A created date.
//    public let created: Date
//    /// A updated date.
//    public let updated: Date
//    /// A text.
//    public let text: String
//    /// A used command name.
//    public let command: String?
//    /// A used command args.
//    public let args: String?
//    /// Attachments (see `Attachment`).
//    public let attachments: [Attachment]
//    /// A parent message id.
//    public let parentId: String?
//    /// Check if this reply message needs to show in the channel.
//    public let showReplyInChannel: Bool
//    /// Mentioned users (see `User`).
//    public let mentionedUsers: [User]
//    /// An extra data for the message.
//    public let extraData: Codable?
//}
//
//public struct ChannelWrapper: Encodable {
//    /// Coding keys for the encoding.
//    private enum CodingKeys: String, CodingKey {
//        case id
//        case cid
//        case type
//        case name
//        case imageURL = "image"
//        case members
//        case lastMessageDate = "last_message_at"
//        case createdBy = "created_by"
//        case created = "created_at"
//        case deleted = "deleted_at"
//        case frozen
//    }
//
//    init(channel: Channel) {
//        id = channel.id
//        cid = channel.cid
//        type = channel.type
//        name = channel.name
//        imageURL = channel.imageURL
//        lastMessageDate = channel.lastMessageDate
//        created = channel.created
//        deleted = channel.deleted
//        createdBy = channel.createdBy
//        config = channel.config
//        frozen = channel.frozen
//        extraData = channel.extraData
//    }
//
//    /// A channel id.
//    public let id: String
//    /// A channel type + id.
//    public let cid: ChannelId
//    /// A channel type.
//    public let type: ChannelType
//    /// A channel name.
//    public let name: String?
//    /// An image of the channel.
//    public let imageURL: URL?
//    /// The last message date.
//    public let lastMessageDate: Date?
//    /// A channel created date.
//    public let created: Date
//    /// A channel deleted date.
//    public let deleted: Date?
//    /// A creator of the channel.
//    public let createdBy: User?
//    /// A config.
//    public let config: Channel.Config
//    /// Checks if the channel is frozen.
//    public let frozen: Bool
//    /// A list of user ids of the channel members.
//    public let members = Set<Member>()
//    /// An extra data for the channel.
//    public let extraData: Codable?
//}
