//
//  Copyright (c) 2019 Open Whisper Systems. All rights reserved.
//

import Foundation
import SessionServiceKit
import SignalMessaging

class DebugUIProfile: DebugUIPage {

    // MARK: - Dependencies

    var messageSender: MessageSender {
        return SSKEnvironment.shared.messageSender
    }
    var profileManager: OWSProfileManager {
        return OWSProfileManager.shared()
    }

    // MARK: - Overrides

    override func name() -> String {
        return "Profile"
    }

    override func section(thread aThread: TSThread?) -> OWSTableSection? {
        let profileManager = self.profileManager
        let sectionItems = [
            OWSTableItem(title: "Clear Profile Whitelist") {
                profileManager.clearProfileWhitelist()
            },
            OWSTableItem(title: "Log Profile Whitelist") {
                profileManager.logProfileWhitelist()
            },
            OWSTableItem(title: "Log User Profiles") {
                profileManager.logUserProfiles()
            },
            OWSTableItem(title: "Log Profile Key") {
                let localProfileKey = profileManager.localProfileKey()
                Logger.info("localProfileKey: \(localProfileKey.keyData.hexadecimalString)")
                profileManager.logUserProfiles()
            },
            OWSTableItem(title: "Regenerate Profile/ProfileKey") {
                profileManager.regenerateLocalProfile()
            },
            OWSTableItem(title: "Send Profile Key Message") { [weak self] in
                guard let strongSelf = self else { return }

                // MJK TODO - should be safe to remove this senderTimestamp
                let message = OWSProfileKeyMessage(timestamp: NSDate.ows_millisecondTimeStamp(), in: aThread)
                strongSelf.messageSender.sendPromise(message: message).done {
                    Logger.info("Successfully sent profile key message to thread: \(String(describing: aThread))")
                }.catch { _ in
                    owsFailDebug("Failed to send profile key message to thread: \(String(describing: aThread))")
                }.retainUntilComplete()
            }
        ]

        return OWSTableSection(title: "Profile", items: sectionItems)
    }

}
