//
//  KMSubscribeWaterMarkWindowController.swift
//  PDF Master
//
//  Created by lizhe on 2023/6/12.
//

import Cocoa
var subscribeWaterMarkController: KMSubscribeWaterMarkWindowController?
var subscribeWaterMarkMainWindow: NSWindow?

@objc enum KMSubscribeWaterMarkType: Int {
    case none       = 0
    case stamp      = 1
    case link
    case sign
    case editText
    case editImage
    case insert
    case extract
    case replace
    case split
    case delete
    case rotate
    case copy
    case toWord
    case toExcel
    case toPPT
    case toRTF
    case toCSV
    case toHTML
    case toText
    case toImage
    case compress
    case merge
    case setPassword
    case removePassword
    case crop
    case aiTranslate
    case aiRewrite
    case aiCorrect
}

typealias KMSubscribeWaterMarkWindowControllerCloseAction = (_ controller: KMSubscribeWaterMarkWindowController) -> Void
typealias KMSubscribeWaterMarkWindowControllerWatermarkExportAction = (_ controller: KMSubscribeWaterMarkWindowController) -> Void
typealias KMSubscribeWaterMarkWindowControllerSubscribeAction = (_ controller: KMSubscribeWaterMarkWindowController) -> Void
typealias KMSubscribeWaterMarkWindowControllerRestoreAction = (_ controller: KMSubscribeWaterMarkWindowController) -> Void

class KMSubscribeWaterMarkWindowController: NSWindowController {

    @IBOutlet weak var waterMarkView: KMSubscribeWaterMarkView!
    @IBOutlet weak var waterViewHeightConstrain: NSLayoutConstraint!
    
    var closeAction: KMSubscribeWaterMarkWindowControllerCloseAction?
    var subscribeAction: KMSubscribeWaterMarkWindowControllerSubscribeAction?
    var watermarkExportAction: KMSubscribeWaterMarkWindowControllerWatermarkExportAction?
    var restoreAction: KMSubscribeWaterMarkWindowControllerRestoreAction?
    
    var isContinue: Bool?
    var isAI: Bool?
    
    deinit {
        KMPrint("KMSubscribeWaterMarkWindowController 释放")
    }
    
    override func windowDidLoad() {
        super.windowDidLoad()
        self.setup()
        self.reloadData()
        // Implement this method to handle any initialization after your window controller's window has been loaded from its nib file.
    }
    
    override func awakeFromNib() {
        super.awakeFromNib()
        
        if let data = self.isAI, data {
            self.waterMarkView.waterExportButton.isHidden = true
            self.waterMarkView.subTrailingConst.constant = 60
            self.waterMarkView.subWidthConst.constant = 280
            self.waterMarkView.preferentialImageTrailingConst.constant = 92
        } else {
            self.waterMarkView.waterExportButton.isHidden = false
            self.waterMarkView.subTrailingConst.constant = 0
            self.waterMarkView.subWidthConst.constant = 192
            self.waterMarkView.preferentialImageTrailingConst.constant = 32
        }
    }
    
    //MARK: 打开文件
    static func show(window: NSWindow, isContinue: Bool = false, isAI: Bool = false, type: KMSubscribeWaterMarkType = .none,  completion: @escaping (_ isSubscribeSuccess: Bool, _ isWaterMarkExport: Bool, _ isClose: Bool) -> Void) -> KMSubscribeWaterMarkWindowController {
        let subscribeWaterMarkWindowController: KMSubscribeWaterMarkWindowController = KMSubscribeWaterMarkWindowController.init(windowNibName: "KMSubscribeWaterMarkWindowController")

        subscribeWaterMarkWindowController.isContinue = isContinue
        subscribeWaterMarkWindowController.isAI = isAI
        window.beginSheet(subscribeWaterMarkWindowController.window!)
        subscribeWaterMarkWindowController.window?.center()
        
        if isContinue {
            subscribeWaterMarkWindowController.waterMarkView.waterExportButton.title = NSLocalizedString("Continue", comment: "")
        } else {
            subscribeWaterMarkWindowController.waterMarkView.waterExportButton.title = NSLocalizedString("带水印保存", comment: "")
        }
        
        subscribeWaterMarkWindowController.closeAction = { controller in
            completion(false, false, true)
            subscribeWaterMarkMainWindow?.endSheet(controller.window!)
            controller.window?.close()
            
            subscribeWaterMarkController = nil
            subscribeWaterMarkMainWindow = nil
        }
        
        subscribeWaterMarkWindowController.watermarkExportAction = { controller in
            completion(false, true, false)
            subscribeWaterMarkMainWindow?.endSheet(controller.window!)
            controller.window?.close()
            subscribeWaterMarkController = nil
            subscribeWaterMarkMainWindow = nil
        }
        
        subscribeWaterMarkWindowController.subscribeAction = { controller in
            // 数据埋点
            controller.trackEvent(type: type)
            
            controller.waterMarkView.beginLoading(backgroundColor: NSColor.black.withAlphaComponent(0.2))
            KMPurchaseManager.manager.purchaseProduct(productIdentifier: PRODUCT_1) { isSuccess, error in
                if isSuccess {
                    subscribeWaterMarkMainWindow?.endSheet(controller.window!)
                    controller.window?.close()
                    subscribeWaterMarkController = nil
                    subscribeWaterMarkMainWindow = nil
                    
                    DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 0.1) {
                        if NSApp.mainWindow != nil {
                            let controller = KMSubscribeSuccessWindowController.show(window: NSApp.mainWindow!)
                            controller.closeAction = { controller in
                                controller.closeWindow()
                                completion(true, false, false)
                            }
                        }
                    }
                } else {
                    KMComparativeTableViewController.purchasefailed(state: .failed)
                    completion(false, false, false)
                }
                
                controller.waterMarkView.endLoading()
            }
        }
        
        subscribeWaterMarkWindowController.restoreAction = { controller in
            controller.waterMarkView.beginLoading(backgroundColor: NSColor.black.withAlphaComponent(0.2))
            KMPurchaseManager.manager.restorePurchases { isSuccess in
                if isSuccess {
                    subscribeWaterMarkMainWindow?.endSheet(controller.window!)
                    controller.window?.close()
                    subscribeWaterMarkController = nil
                    subscribeWaterMarkMainWindow = nil
                    
                    DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 0.1) {
                        if NSApp.mainWindow != nil {
                            let controller = KMSubscribeSuccessWindowController.show(window: NSApp.mainWindow!)
                            controller.closeAction = { controller in
                                controller.closeWindow()
                                completion(true, false, false)
                            }
                        }
                    }
                } else {
                    KMComparativeTableViewController.purchasefailed(state: .restoreFailed)
                    completion(false, false, false)
                }
                controller.waterMarkView.endLoading()
            }
        }
        
        subscribeWaterMarkController = subscribeWaterMarkWindowController
        subscribeWaterMarkMainWindow = window
        return subscribeWaterMarkWindowController
    }
    
    func setup() {
        self.window?.contentView?.backgroundColor(NSColor(hex: "#FFFFFF"))
        self.waterMarkView.waterExportButton.title = ""
        self.waterMarkView.closeAction = { [weak self] view in
            guard let callBack = self?.closeAction else { return }
            
            callBack((self!))
        }
        
        self.waterMarkView.waterMarkExportAction = { [weak self] view in
            self?.trackEvent(eventName: "PUW_Sub_SaveWatermark")
            
            guard let callBack = self?.watermarkExportAction else { return }
            
            callBack((self!))
        }
        
        self.waterMarkView.subscribeAction = { [weak self] view in
            self?.trackEvent(eventName: "PUW_Sub_Subscribe")
            
            guard let callBack = self?.subscribeAction else { return }
            
            callBack((self!))
        }
        
        self.waterMarkView.restoreAction = { [weak self] view in
            guard let callBack = self?.restoreAction else { return }
            
            callBack((self!))
        }
    }
    
    func closeWindow() {
        if subscribeWaterMarkMainWindow != nil {
            subscribeWaterMarkMainWindow?.endSheet((subscribeWaterMarkController?.window)!)
        }
        
        if subscribeWaterMarkController != nil {
            subscribeWaterMarkController?.window?.close()
        }
        subscribeWaterMarkController = nil
        subscribeWaterMarkMainWindow = nil
    }
    
    func reloadData() {
        #if VERSION_FREE
        self.waterViewHeightConstrain.constant = 511
        #endif
        
        #if VERSION_DMG
        self.waterViewHeightConstrain.constant = 511 - 80
        #endif
    }
    
    static func isSampleController() -> KMSubscribeWaterMarkWindowController {
        for window in NSApp.windows {
            let controller = window.windowController
            if controller is KMSubscribeWaterMarkWindowController {
                return controller as! KMSubscribeWaterMarkWindowController
            }
        }
        return KMSubscribeWaterMarkWindowController()
    }
}

// MARK: - Analytics (埋点)

extension KMSubscribeWaterMarkWindowController {
    func trackEvent(eventName: String) -> Void {
        KMAnalytics.trackEvent(eventName: eventName, parameters: [
            KMAnalytics.Parameter.categoryKey : KMAnalytics.Category.puw,
            KMAnalytics.Parameter.labelKey : KMAnalytics.Label.sub_PUW], platform: .AppCenter, appTarget: .dmg)
    }
    
    func trackEvent(type: KMSubscribeWaterMarkType) -> Void {
        if (type == .stamp) {
            KMAnalytics.trackEvent(eventName: "PDFMaster_Subscribe_Stamp", parameters: nil, appTarget: .dmg)
        } else if (type == .link) {
            KMAnalytics.trackEvent(eventName: "PDFMaster_Subscribe_Link", parameters: nil, appTarget: .dmg)
        } else if (type == .sign) {
            KMAnalytics.trackEvent(eventName: "PDFMaster_Subscribe_Sign", parameters: nil, appTarget: .dmg)
        } else if (type == .editText) {
            KMAnalytics.trackEvent(eventName: "PDFMaster_Subscribe_EditText", parameters: nil, appTarget: .dmg)
        } else if (type == .editImage) {
            KMAnalytics.trackEvent(eventName: "PDFMaster_Subscribe_EditImage", parameters: nil, appTarget: .dmg)
        } else if (type == .insert) {
            KMAnalytics.trackEvent(eventName: "PDFMaster_Subscribe_Insert", parameters: nil, appTarget: .dmg)
        } else if (type == .extract) {
            KMAnalytics.trackEvent(eventName: "PDFMaster_Subscribe_Extract", parameters: nil, appTarget: .dmg)
        } else if (type == .replace) {
            KMAnalytics.trackEvent(eventName: "PDFMaster_Subscribe_Replace", parameters: nil, appTarget: .dmg)
        } else if (type == .split) {
            KMAnalytics.trackEvent(eventName: "PDFMaster_Subscribe_Split", parameters: nil, appTarget: .dmg)
        } else if (type == .delete) {
            KMAnalytics.trackEvent(eventName: "PDFMaster_Subscribe_Delete", parameters: nil, appTarget: .dmg)
        } else if (type == .rotate) {
            KMAnalytics.trackEvent(eventName: "PDFMaster_Subscribe_Rotate", parameters: nil, appTarget: .dmg)
        } else if (type == .copy) {
            KMAnalytics.trackEvent(eventName: "PDFMaster_Subscribe_Copy", parameters: nil, appTarget: .dmg)
        } else if (type == .toWord) {
            KMAnalytics.trackEvent(eventName: "PDFMaster_Subscribe_ToWord", parameters: nil, appTarget: .dmg)
        } else if (type == .toExcel) {
            KMAnalytics.trackEvent(eventName: "PDFMaster_Subscribe_ToExcel", parameters: nil, appTarget: .dmg)
        } else if (type == .toPPT) {
            KMAnalytics.trackEvent(eventName: "PDFMaster_Subscribe_ToPPT", parameters: nil, appTarget: .dmg)
        } else if (type == .toRTF) {
            KMAnalytics.trackEvent(eventName: "PDFMaster_Subscribe_ToRTF", parameters: nil, appTarget: .dmg)
        } else if (type == .toCSV) {
            KMAnalytics.trackEvent(eventName: "PDFMaster_Subscribe_ToCSV", parameters: nil, appTarget: .dmg)
        } else if (type == .toHTML) {
            KMAnalytics.trackEvent(eventName: "PDFMaster_Subscribe_ToHTML", parameters: nil, appTarget: .dmg)
        } else if (type == .toText) {
            KMAnalytics.trackEvent(eventName: "PDFMaster_Subscribe_ToText", parameters: nil, appTarget: .dmg)
        } else if (type == .toImage) {
            KMAnalytics.trackEvent(eventName: "PDFMaster_Subscribe_ToImage", parameters: nil, appTarget: .dmg)
        } else if (type == .compress) {
            KMAnalytics.trackEvent(eventName: "PDFMaster_Subscribe_Compress", parameters: nil, appTarget: .dmg)
        } else if (type == .merge) {
            KMAnalytics.trackEvent(eventName: "PDFMaster_Subscribe_Merge", parameters: nil, appTarget: .dmg)
        } else if (type == .setPassword) {
            KMAnalytics.trackEvent(eventName: "PDFMaster_Subscribe_SetPassword", parameters: nil, appTarget: .dmg)
        } else if (type == .removePassword) {
            KMAnalytics.trackEvent(eventName: "PDFMaster_Subscribe_RemovePassword", parameters: nil, appTarget: .dmg)
        } else if (type == .crop) {
            KMAnalytics.trackEvent(eventName: "PDFMaster_Subscribe_Crop", parameters: nil, appTarget: .dmg)
        } else if (type == .aiTranslate) {
            KMAnalytics.trackEvent(eventName: "PDFMaster_Subscribe_AITranslate", parameters: nil, appTarget: .dmg)
        } else if (type == .aiRewrite) {
            KMAnalytics.trackEvent(eventName: "PDFMaster_Subscribe_AIRewrite", parameters: nil, appTarget: .dmg)
        } else if (type == .aiCorrect) {
            KMAnalytics.trackEvent(eventName: "PDFMaster_Subscribe_AICorrect", parameters: nil, appTarget: .dmg)
        }
    }
}