//
//  KMCompressWindowController.swift
//  PDF Reader Pro
//
//  Created by tangchao on 2022/11/25.
//

import Cocoa

typealias KMCompressWindowControllerItemClick = (Int)->()
typealias KMCompressWindowControllerResultCallback = (_ result: Bool,_ openDocuemt: Bool, _ fileURL: URL, _ error: String)->()
class KMCompressWindowController: NSWindowController {

    @IBOutlet weak var titleLabel: NSTextField!
    
    @IBOutlet weak var largeBox: NSBox!
    @IBOutlet weak var standardBox: NSBox!
    @IBOutlet weak var smallBox: NSBox!
    @IBOutlet weak var minimumBox: NSBox!
    
    @IBOutlet weak var batchButton: NSButton!
    @IBOutlet weak var cancelBox: NSBox!
    @IBOutlet weak var compressBox: NSBox!
    
    var documentURL: URL!
    var password: String!
    private var datas: [String] = []
    var selectIndex = 2
    
    var limit = true
    var oriDocumentUrl: URL?
    
    var itemClick       : KMCompressWindowControllerItemClick!
    var resultCallback  : KMCompressWindowControllerResultCallback!
    var largeVC         : KMDesignButton!
    var standardVC      : KMDesignButton!
    var smallVC         : KMDesignButton!
    var minimumVC       : KMDesignButton!
    var cancelVC        : KMDesignButton!
    var compressVC      : KMDesignButton!

    deinit {
        KMPrint("KMCompressWindowController 已释放")
    }
    
    override func windowDidLoad() {
        super.windowDidLoad()
//        self.window?.appearance = NSAppearance(named: .aqua)
        largeVC = KMDesignButton.init(withType: .RadioButton)
        standardVC = KMDesignButton.init(withType: .RadioButton)
        smallVC = KMDesignButton.init(withType: .RadioButton)
        minimumVC = KMDesignButton.init(withType: .RadioButton)
        cancelVC = KMDesignButton.init(withType: .Text)
        compressVC = KMDesignButton.init(withType: .Text)
        largeBox.fillColor = .clear
        largeBox.contentView = largeVC.view
        standardBox.fillColor = .clear
        standardBox.contentView = standardVC.view
        smallBox.fillColor = .clear
        smallBox.contentView = smallVC.view
        minimumBox.fillColor = .clear
        minimumBox.contentView = minimumVC.view
        cancelBox.fillColor = .clear
        cancelBox.contentView = cancelVC.view
        compressBox.fillColor = .clear
        compressBox.contentView = compressVC.view
        
        titleLabel.stringValue = NSLocalizedString("Compress", comment: "")
        
        batchButton.isBordered = false
        batchButton.title = NSLocalizedString("Batch", comment: "")
        batchButton.wantsLayer = true
        batchButton.layer?.borderWidth = 1
        batchButton.layer?.borderColor = NSColor.black.cgColor
        batchButton.layer?.cornerRadius = 4
        batchButton.target = self
        batchButton.action = #selector(batchButtonAction)
        batchButton.isHidden = true
        
        cancelVC.target = self
        cancelVC.action = #selector(cancelButtonAction)
        cancelVC.stringValue = NSLocalizedString("Cancel", comment: "")
        cancelVC.button(type: .Sec, size: .m)
        cancelVC.button.keyEquivalent = KMKeyEquivalent.esc.string()
        
        compressVC.target = self
        compressVC.action = #selector(compressButtonAction)
        compressVC.stringValue = NSLocalizedString("Compress", comment: "")
        compressVC.button(type: .Cta, size: .m)
        compressVC.button.keyEquivalent = KMKeyEquivalent.enter
        
        largeVC.target = self
        largeVC.action = #selector(self.radioButtonAction(_:))
        largeVC.stringValue = NSLocalizedString("Large File Size", comment: "")
        largeVC.checkbox_radio()
        
        standardVC.target = self
        standardVC.action = #selector(self.radioButtonAction(_:))
        standardVC.stringValue = NSLocalizedString("Standard File Size", comment: "")
        standardVC.checkbox_radio()

        smallVC.target = self
        smallVC.action = #selector(self.radioButtonAction(_:))
        smallVC.stringValue = NSLocalizedString("Small File Size", comment: "")
        smallVC.checkbox_radio()

        minimumVC.target = self
        minimumVC.action = #selector(self.radioButtonAction(_:))
        minimumVC.stringValue = NSLocalizedString("Minimum File Size", comment: "")
        minimumVC.checkbox_radio()
        
        self.initUIProperty()
        
        smallVC.state = .Checked
        
        Task { @MainActor in
            if await (KMLightMemberManager.manager.canPayFunction() == false) {
                self.limit = true
            } else {
                self.limit = false
            }
        }
    }
    
    private func initUIProperty() {
        self.titleLabel.textColor = NSColor.titleColor()
        self.titleLabel.font = .SFProTextSemiboldFont(16)
        
        self.batchButton.setTitleColor(color: NSColor.buttonTitleColor())
        self.batchButton.layer?.borderColor = NSColor.buttonBorderColor().cgColor
        self.batchButton.font = .SFProTextRegularFont(14)
    }
    
    @objc func radioButtonAction(_ sender: NSButton) {
        largeVC.state = .Norm
        standardVC.state = .Norm
        smallVC.state = .Norm
        minimumVC.state = .Norm
        if (largeVC.button == sender) {
            largeVC.state = .Checked
            self.selectIndex = 0
        } else if (standardVC.button == sender) {
            standardVC.state = .Checked
            self.selectIndex = 1
        } else if (smallVC.button == sender) {
            smallVC.state = .Checked
            self.selectIndex = 2
        } else if (minimumVC.button == sender) {
            minimumVC.state = .Checked
            self.selectIndex = 3
        }
    }
    
    @objc func batchButtonAction() {
        guard let callback = itemClick else {
            return
        }
        
        callback(1)
    }
    
    @objc func cancelButtonAction() {
        self._clearData()
        
        guard let callback = itemClick else {
            return
        }
        
        callback(2)
    }
    
    @objc func compressButtonAction() {
        if documentURL == nil {
            return
        }
        
        Task { @MainActor in
            if await (KMLightMemberManager.manager.canPayFunction() == false) {
                let _ = KMSubscribeWaterMarkWindowController.show(window: self.window!) { isSubscribeSuccess, isWaterMarkExport, isClose in
                    if (isClose) {
                        return
                    }
                    if (isSubscribeSuccess) {
                        self._compressButtonAction()
                    }
                    if (isWaterMarkExport) {
                        self._compressButtonAction(limit: true)
                    }
                }
                return
            }
            self._compressButtonAction()
        }
    }
    
    func getUniqueFilePath(filePath: String) -> String {
        var i: Int = 0
        var isDirectory: ObjCBool = false
        var uniqueFilePath = filePath
        let fileManager = FileManager.default
        fileManager.fileExists(atPath: uniqueFilePath, isDirectory: &isDirectory)
        if isDirectory.boolValue {
            var path: String = ""
            while fileManager.fileExists(atPath: uniqueFilePath) {
                i += 1
                
                path = filePath
                path.append("(\(i))")
                uniqueFilePath = path
            }
        } else {
            let fileURL = URL(fileURLWithPath: filePath)
            var path: String = ""
            while fileManager.fileExists(atPath: uniqueFilePath) {
                i += 1
                
                path = fileURL.deletingPathExtension().path
                path.append("(\(i))")
                path.append(".")
                path.append(fileURL.pathExtension)
                uniqueFilePath = path
            }
        }
        return uniqueFilePath
    }
    
    private func _compressButtonAction(limit: Bool = false) {
        DispatchQueue.main.async {
            NSPanel.savePanel(self.window!, true) { panel in
                var url: URL = self.documentURL
                if (self.oriDocumentUrl != nil) {
                    url = self.oriDocumentUrl!
                }
                panel.nameFieldStringValue = ""+url.deletingPathExtension().lastPathComponent+"_Compressed"
                panel.allowedFileTypes = ["pdf"]
            } completion: { response, url, isOpen in
                if (response == .cancel) {
                    return
                }
                
                self.beginLoading()
                DispatchQueue.global().async {
                    let docuemt = CPDFDocument.init(url: self.documentURL)
                    if (docuemt?.isLocked)! && self.password != nil {
                        docuemt?.unlock(withPassword: self.password)
                    }
                    
                    var option = 60
                    if self.selectIndex == 0 {
                        option = 120
                    } else if self.selectIndex == 1 {
                        option = 90
                    } else if self.selectIndex == 2 {
                        option = 60
                    } else if self.selectIndex == 3 {
                        option = 30
                    }
                    //
                    
                    var result = false
                    if (limit) {
                        if let _document = docuemt, let _ = KMTools.saveWatermarkDocumentForCompress(document: _document, to: url!, imageQuality: option) {
                            result = true
                        }
                    } else {
                        if let data = docuemt?.writeOptimize(to: url, withOptions: [.imageQualityOption : option]) {
                            result = data
                        }
                    }
                    
                    if (result) {
                        self._clearData()
                    }
                    
                    DispatchQueue.main.async {
                        self.endLoading()
                        guard let callback = self.resultCallback else {
                            if (result) {
                                if isOpen { /// 开启文档
                                    NSDocumentController.shared.km_safe_openDocument(withContentsOf: url!, display: true) { _, _, _ in
                                        
                                    }
                                } else {
                                    NSWorkspace.shared.activateFileViewerSelecting([url!])
                                }
                            }
                            return
                        }
                        
                        callback(result, isOpen, url!, "")
                    }
                }
            }
        }
    }
    
    private func _clearData() {
        if let _ = self.oriDocumentUrl {
            if let data = self.documentURL?.path, FileManager.default.fileExists(atPath: data) {
                try?FileManager.default.removeItem(atPath: data)
            }
        }
    }
}

extension KMCompressWindowController: NSTableViewDataSource {
    func numberOfRows(in tableView: NSTableView) -> Int {
         datas.count
    }
    
}

extension KMCompressWindowController: KMLoadingProtocol {
    func beginLoading() {
        self.window?.contentView?.beginLoading()
    }
    
    func endLoading() {
        self.window?.contentView?.endLoading()
    }
}