//
//  KMConvertBaseWindowController.swift
//  PDF Master
//
//  Created by tangchao on 2022/12/5.
//

import Cocoa
import PDFKit

let kKMConvertLanugageSelectedIndex: String = "KMConvertLanugageSelectedIndex"

typealias KMConvertSettingViewPageRangeDidChangeCallback = (_ pageRange: KMPageRange) -> Void
typealias KMConvertSettingViewPageRangeDidInputFinishCallback = (_ pageRangeString: String) -> ()
typealias KMConvertSettingViewLanugageDidSelectedCallback = (_ index: Int) -> ()
class KMConvertSettingView: NSView {
    private var myCurrentLanguage: String!
    var currentLanguage: String {
        get {
            return myCurrentLanguage
        }
        set {
            myCurrentLanguage = newValue
            
            let index = UserDefaults.standard.string(forKey: kKMConvertLanugageSelectedIndex)
            if (index != nil && !index!.isEmpty) {
                ocrLanuguageIndex = Int(index!)!
                return
            }

            if (newValue.hasPrefix("zh-Hans")) {
                ocrLanuguageIndex = 0
            } else if (newValue.hasPrefix("en")) {
                ocrLanuguageIndex = 2
            } else if (newValue.hasPrefix("zh-Hant")) {
                ocrLanuguageIndex = 1
            } else if (newValue.hasPrefix("fr")) {
                ocrLanuguageIndex = 3
            } else if (newValue.hasPrefix("de")) {
                ocrLanuguageIndex = 4
            } else if (newValue.hasPrefix("ht")) { ///  海地克里奥尔语 Haitian
                ocrLanuguageIndex = 5
            } else if (newValue.hasPrefix("ja")) {
                ocrLanuguageIndex = 6
            } else if (newValue.hasPrefix("ko")) {
                ocrLanuguageIndex = 7
            } else if (newValue.hasPrefix("la")) { ///  拉丁语 Latin
                ocrLanuguageIndex = 8
            } else {
                ocrLanuguageIndex = 2
            }
        }
    }
    
    var ocrLanuguageIndex: Int = 3
    
    var pageRangeSelectedIndex: Int = 0
    var pageRangeDidChange: KMConvertSettingViewPageRangeDidChangeCallback?
    var pageRangeDidInputFinishCallback: KMConvertSettingViewPageRangeDidInputFinishCallback!
    var lanugageDidSelected: KMConvertSettingViewLanugageDidSelectedCallback!
    
    var ocrItemView: KMConvertOCRSettingItemView!
    var pageRangeItemView: KMConvertPageRangeSettingItemView?
    
    var pageCount = 0 {
        didSet {
            self.pageRangeItemView?.pageCount = self.pageCount
        }
    }
    
    func getPageRangeString() -> String {
        return ""
    }
}

typealias KMConvertBaseWindowControllerItemClick = (Int) -> ()
class KMConvertBaseWindowController: NSWindowController {
    
    @IBOutlet weak var titleLabel: NSTextField!
    
    @IBOutlet weak var leftBox: NSBox!
    @IBOutlet weak var prePDFView: KMCustomPDFView?
    @IBOutlet weak var numberBox: NSView!
    @IBOutlet weak var numberTextField: NSTextField!
    @IBOutlet weak var perLabel: NSTextField!
    @IBOutlet weak var totalNumberLabel: NSTextField!
    @IBOutlet weak var backBox: NSBox!
    @IBOutlet weak var nextBox: NSBox!
    
    @IBOutlet weak var rightScrollView: NSScrollView!
    
    @IBOutlet weak var batchButton: NSButton!
    @IBOutlet weak var canelBox: NSBox!
    @IBOutlet weak var convertBox: NSBox!
    var canelButtonVC: KMDesignButton!
    var convertButtonVC: KMDesignButton!
    var backButtonVC: KMDesignButton!
    var nextButtonVC: KMDesignButton!

    var itemClick: KMConvertBaseWindowControllerItemClick!
    
    var documentModel: KMDocumentModel!
    
    var currentPageIndex: Int = 1
    var pageRange = KMPageRange.all
    var pageRangeString: String = ""
    var settingView: KMConvertSettingView!
    
    private var maskView: NSButton!
    private var indicator: NSProgressIndicator!
    
    var subType: Int = 0
    
    deinit {
        KMPrint("KMConvertBaseWindowController 已释放")
        self.prePDFView?.removeFromSuperview()
        self.prePDFView = nil
    }
    
    var fileExtension: String {
        get {
            return ""
        }
    }
    
    var progressController: SKProgressController?
    var convert: KMPDFConvert?
    
    convenience init() {
        self.init(windowNibName: "KMConvertBaseWindowController")
    }
    
    override func awakeFromNib() {
        super.awakeFromNib()
        DispatchQueue.main.async {
            self.window?.makeFirstResponder(nil)
        }
    }
    
    override func windowDidLoad() {
        super.windowDidLoad()
        self.window?.appearance = NSAppearance(named: .aqua)
        
        canelButtonVC = KMDesignButton.init(withType: .Text)
        convertButtonVC = KMDesignButton.init(withType: .Text)
        backButtonVC = KMDesignButton.init(withType: .Image)
        nextButtonVC = KMDesignButton.init(withType: .Image)
        self.totalNumberLabel.lineBreakMode = .byTruncatingTail
        
        if documentModel != nil {
            let document = CPDFDocument(url: documentModel.documentURL)
            if (document!.isLocked) {
                document?.unlock(withPassword: self.documentModel.password)
            }
            self.prePDFView?.document = document!
            
            let number: Int = Int((self.prePDFView?.document.pageCount)!)
            let string = "\(number)"
            totalNumberLabel.stringValue = string
        }
        if (self.prePDFView?.documentView() != nil) {
            self.prePDFView?.documentView().enclosingScrollView?.hasVerticalScroller = false
            self.prePDFView?.documentView().enclosingScrollView?.hasHorizontalScroller = false
        }
        
        self.prePDFView?.setDisplay(.singlePage)
        self.prePDFView?.layoutDocumentView()
        self.prePDFView?.autoScales = true
        self.prePDFView?.delegate = self
        
        backBox.fillColor = .clear
        backBox.contentView = backButtonVC.view
        backButtonVC.target = self
        backButtonVC.action = #selector(backButtonAction)
        backButtonVC.image = NSImage(named: "KMImageNameLeftButtonImage")!
        backButtonVC.image_disabled = NSImage(named: "KMImageNameLeftButtonImageDis")!
        backButtonVC.pagination()
        
        numberBox.wantsLayer = true
        self.numberBox.layer?.backgroundColor = NSColor.white.cgColor
        numberBox.layer?.borderWidth = 1
        numberBox.layer?.cornerRadius = 4
        numberTextField.focusRingType = .none
        numberTextField.delegate = self
        self.numberTextField.isBordered = false
        
        nextBox.fillColor = .clear
        nextBox.contentView = nextButtonVC.view
        nextButtonVC.target = self
        nextButtonVC.action = #selector(nextButtonAction)
        nextButtonVC.image = NSImage(named: "KMImageNameRightButtonImage")!
        nextButtonVC.image_disabled = NSImage(named: "KMImageNameRightButtonImageDis")!
        nextButtonVC.pagination()

        batchButton.title = NSLocalizedString("Batch", comment: "")
        batchButton.isBordered = false
        batchButton.wantsLayer = true
        batchButton.layer?.borderWidth = 1
        batchButton.layer?.cornerRadius = 4
        batchButton.target = self
        batchButton.action = #selector(batchButtonAction)
        batchButton.isHidden = true
        
        canelBox.fillColor = .clear
        canelBox.contentView = canelButtonVC.view
        canelButtonVC.target = self
        canelButtonVC.action = #selector(cancelButtonAction)
        canelButtonVC.stringValue = NSLocalizedString("Cancel", comment: "")
        canelButtonVC.button(type: .Sec, size: .m)
        canelButtonVC.button.keyEquivalent = KMKeyEquivalent.esc.string()
        
        convertBox.fillColor = .clear
        convertBox.contentView = convertButtonVC.view
        convertButtonVC.target = self
        convertButtonVC.action = #selector(convertButtonAction)
        convertButtonVC.stringValue = NSLocalizedString("Convert", comment: "")
        convertButtonVC.button(type: .Cta, size: .m)
//        convertButtonVC.button.keyEquivalent = KMKeyEquivalent.enter
        self.rightScrollView.hasVerticalScroller = false
        self.rightScrollView.hasHorizontalScroller = false
        
        self.initUIProperty()
        
        self.updateBackAndNextButtonState()
    }
    
    private func initUIProperty() {
        self.titleLabel.textColor = NSColor.titleColor()
        self.titleLabel.font = .SFProTextSemibold(16)
        
        self.leftBox.fillColor = NSColor(hex: "#F7F8FA")
        self.prePDFView?.backgroundColor = NSColor(hex: "#F7F8FA")
        self.numberBox.layer?.borderColor = NSColor(hex: "#DFE1E5").cgColor
        self.perLabel.textColor = NSColor.titleColor()
        self.perLabel.font = .SFProTextRegular(12)
        self.totalNumberLabel.textColor = NSColor.titleColor()
        self.totalNumberLabel.font = .SFProTextRegular(12)
        
        self.batchButton.setTitleColor(NSColor.buttonTitleColor())
        self.batchButton.layer?.borderColor = NSColor.buttonBorderColor().cgColor
        self.batchButton.font = .SFProTextRegular(14)
    }
    
    @objc func backButtonAction() {
        if let _ = self.prePDFView?.canGoToPreviousPage() {
            self.currentPageIndex -= 1
            self.prePDFView?.goToPreviousPage(nil)
            
            self.numberTextField.stringValue = "\(self.prePDFView!.currentPageIndex+1)"
            self.updateBackAndNextButtonState()
        }
    }
    
    @objc func nextButtonAction() {
        if let _ = self.prePDFView?.canGoToNextPage() {
            self.currentPageIndex += 1
            self.prePDFView?.goToNextPage(nil)
            
            self.numberTextField.stringValue = "\(self.prePDFView!.currentPageIndex+1)"
            self.updateBackAndNextButtonState()
        }
    }
    
    @objc func batchButtonAction() {
        guard let callback = itemClick else {
            return
        }
        
        callback(1)
    }
    
    @objc func cancelButtonAction() {
        guard let callback = itemClick else {
            return
        }
        
        callback(2)
    }
    
    @objc func convertButtonAction() {
        self.window?.makeFirstResponder(nil)
        if (self.pageRange == .custom) {
            let array = self.findSelectPage(pageRangeString: self.pageRangeString)
            if (array.count <= 0) {
                self.window?.makeFirstResponder(self.settingView.pageRangeItemView?.pageSizeVC.textField)
                return
            }
        }
        
        var pages: [Int] = []
        let filePath = self.getConvertFileSavePath()
        if (FileManager.default.fileExists(atPath: filePath)) {
            try?FileManager.default.removeItem(atPath: filePath)
        }
        if ((self.prePDFView?.document?.writeDecrypt(to: URL(fileURLWithPath: filePath)))!) {
            for i in 0 ..< self.prePDFView!.document.pageCount {
                pages.append(Int(i)+1)
            }
        }
        
        if (pages.count <= 0) {
            let alert = NSAlert()
            alert.alertStyle = .warning
            alert.messageText = NSLocalizedString("Invalid page range or the page number is out of range. Please try again.", comment: "")
            alert.runModal()
            return
        }
        
        NSPanel.savePanel(self.window!) { panel in
            let name = self.prePDFView!.document.documentURL.deletingPathExtension().lastPathComponent
            panel.nameFieldStringValue = name
            panel.allowedFileTypes = [self.fileExtension]
        } completion: { response, url in
            if (response == .cancel) {
                return
            }
            let outputFolderPath = url!.deletingLastPathComponent().path
            let convert = KMPDFConvert()
            self.convert = convert
            convert.password = self.documentModel.password
            convert.outputFolderPath = outputFolderPath
            convert.filePath = filePath
            convert.pages = pages
            let fileName = url!.deletingPathExtension().lastPathComponent
//            if (fileName.isEmpty) {
//                fileName = NSLocalizedString("Untitled", comment: "")
//            }
            convert.outputFileName = fileName
            self.convertModelAppendParams(convert: convert)
            
            DispatchQueue.main.async {
                self.showProgressWindow()
                self.progressController?.maxValue = Double(convert.pages.count)
            }
            
            DispatchQueue.global().async {
                KMPDFConvertManager.defaultManager.convert(convert: convert, progress: { index in
                    DispatchQueue.main.async {
                        self.progressController?.increment(by: 1.0)
                    }
                }) { [unowned self] finished, error in
                    self.hiddenProgressWindow()
                    
                    // 清除临时文件
                    if (FileManager.default.fileExists(atPath: filePath)) {
                        try?FileManager.default.removeItem(atPath: filePath)
                    }
                    if finished {
                        cancelButtonAction()
                        if FileManager.default.fileExists(atPath: convert.outputFilePath) {
                            NSWorkspace.shared.activateFileViewerSelecting([URL(fileURLWithPath: convert.outputFilePath)])
                        }
                    } else {
                        var errorString = ""
                        let myError: NSError? = error as? NSError
                        if myError?.code == 1 {
                            errorString = NSLocalizedString("Password required or incorrect password. Please re-enter your password and try again", comment: "")
                        } else if myError?.code == 2 {
                            errorString = NSLocalizedString("The license doesn't allow the permission", comment: "")
                        } else if myError?.code == 3 {
                            errorString = NSLocalizedString("Malloc failure", comment: "")
                        } else if myError?.code == 4 {
                            errorString = NSLocalizedString("Unknown error in processing conversion. Please try again later", comment: "")
                        } else if myError?.code == 5 {
                            errorString = NSLocalizedString("Unknown error in processing PDF. Please try again later", comment: "")
                        } else if myError?.code == 6 {
                            errorString = NSLocalizedString("File not found or could not be opened. Check if your file exists or choose another file to convert", comment: "")
                        } else if myError?.code == 7 {
                            errorString = NSLocalizedString("File not in PDF format or corruptead. Change a PDF file and try again", comment: "")
                        } else if myError?.code == 8 {
                            errorString = NSLocalizedString("Unsupported security scheme", comment: "")
                        } else if myError?.code == 9 {
                            errorString = NSLocalizedString("Page not found or content error", comment: "")
                        } else {
                            errorString = NSLocalizedString("Table not found", comment: "")
                        }
                        
                        let alert = NSAlert()
                        alert.alertStyle = .critical
                        alert.messageText = NSLocalizedString("Conversion Failed", comment: "")
                        alert.informativeText = errorString
                        alert.addButton(withTitle: NSLocalizedString("OK", comment: ""))
                        alert.runModal()
                    }
                }
            }
            
        }
    }
    
    func convertModelAppendParams(convert: KMPDFConvert) -> () {
        
    }
    
    func getConvertFileSavePath() -> String {
        var path = NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.applicationSupportDirectory, FileManager.SearchPathDomainMask.userDomainMask, true).last
        path?.append("/")
        path?.append(Bundle.main.bundleIdentifier!)
        if (FileManager.default.fileExists(atPath: path!) == false) {
            try?FileManager.default.createDirectory(atPath: path!, withIntermediateDirectories: false)
        }
        
        path?.append("/")
        path?.append("convert.pdf")
        
        return path!
    }
    
    func isValidPagesString(pagesString: String)-> Bool {
        var valid = false
        for ch in pagesString {
            if ch != "0" && ch != "1" && ch != "2" && ch != "3" && ch != "4" && ch != "5" && ch != "6" && ch != "7" && ch != "8" && ch != "9" && ch != "," && ch != "-" {
                valid = false
                break
            } else {
                valid = true
            }
        }
        
        return valid
    }
    
    func findSelectPage(pageRangeString: String) -> ([Int]) {
        if !isValidPagesString(pagesString: pageRangeString) {
            return []
        }
        
        var result: [Int] = []
        let array = pageRangeString.components(separatedBy: ",")
        for string in array {
            if string.isEmpty {
                return []
            } else {
                let pages = string .components(separatedBy: "-")
                if pages.count > 2 {
                    return []
                } else if pages.count == 1 {
                    let page = pages[0]
                    if page.isEmpty || Int(page)! > documentModel.pageCount || Int(page)! == 0 {
                        return []
                    } else {
                        var hasSame: Bool = false
                        for i in result {
                            if i == Int(page)! {
                                hasSame = true
                                return []
                            }
                        }
                        if !hasSame {
                            result.append(Int(page)!)
                        }
                    }
                } else if pages.count == 2 {
                    let page1 = pages[0]
                    let page2 = pages[1]
                    if page1.isEmpty || page2.isEmpty || Int(page1)! >= Int(page2)! || Int(page2)! > documentModel.pageCount || Int(page1)! == 0 {
                        return []
                    } else {
                        var hasSame: Bool = false
                        for i in Int(page1)! ... Int(page2)! {
                            for j in result {
                                if j == i {
                                    hasSame = true
                                    return []
                                }
                            }
                        }
                        if !hasSame {
                            for i in Int(page1)! ... Int(page2)! {
                                result.append(i)
                            }
                        }
                     }
                }
            }
        }
        
        return result
    }
    
    /// 开始加载loading
    func beginLoading() {
        DispatchQueue.main.async { [self] in
            self.maskView = NSButton()
            self.maskView.isBordered = false
            self.maskView.title = ""
            self.maskView.wantsLayer = true
            self.maskView.layer?.backgroundColor = NSColor(white: 1, alpha: 0.3 ).cgColor
            self.maskView.target = self
            self.maskView.action = #selector(maskViewClick)
            self.maskView.frame = (self.window?.contentView!.bounds)!
            self.maskView.autoresizingMask = NSView.AutoresizingMask(rawValue: 18)
            self.window?.contentView?.addSubview(self.maskView)
            
            self.indicator = NSProgressIndicator()
            self.indicator.style = .spinning
            self.indicator.controlSize = .regular
            self.indicator.isIndeterminate = true
            self.window?.contentView?.addSubview(self.indicator)
            let indicatorSize: CGFloat = 32
            self.indicator.frame = NSMakeRect(0.5*(NSWidth((self.window?.contentView!.frame)!)-indicatorSize), 0.5*(NSHeight((self.window?.contentView!.frame)!)-indicatorSize), indicatorSize, indicatorSize)
            self.maskView.autoresizingMask = NSView.AutoresizingMask(rawValue: 45)
            
            self.indicator.startAnimation(nil)
        }
    }
    
    /// 结束加载loading
    func endLoading() {
        DispatchQueue.main.async {
            self.indicator.stopAnimation(nil)
            
            self.indicator.removeFromSuperview()
            self.indicator = nil
            
            self.maskView.removeFromSuperview()
            self.maskView = nil
        }
    }
    
    @objc func maskViewClick() {
        
    }
    
    // MARK: -
    // MARK: Private Methods
    
    private func updateBackAndNextButtonState() {
        var nextEnabled = false
        if let result = self.prePDFView?.canGoToNextPage() {
            nextEnabled = result
        }
        var backEnabled = false
        if let result = self.prePDFView?.canGoToPreviousPage() {
            backEnabled = result
        }
        
        if (Thread.isMainThread) {
            self.backButtonVC.state = backEnabled ? .Norm : .Disabled
            self.nextButtonVC.state = nextEnabled ? .Norm : .Disabled
        } else {
            DispatchQueue.main.async {
                self.backButtonVC.state = backEnabled ? .Norm : .Disabled
                self.nextButtonVC.state = nextEnabled ? .Norm : .Disabled
            }
        }
    }
    
    internal func updatePreView(pageRange: KMPageRange, pageString: String = "") {
        let pages = self.getPages(pageRange, pageString: pageString)
        if (pages == nil || pages!.isEmpty) {
            let alert = NSAlert()
            alert.alertStyle = .warning
            alert.messageText = NSLocalizedString("Invalid page range or the page number is out of range. Please try again.", comment: "")
            alert.runModal()
            return
        }
        var indexs = IndexSet()
        for i in 0 ..< self.prePDFView!.document.pageCount  {
            indexs.insert(IndexSet.Element(i))
        }
        self.prePDFView?.document.removePage(at: indexs)
        
        #if DEBUG
        let pageIndexs = self.getPageIndexs(pageRange, pageString: pageString)
        if (pageIndexs != nil) {
            for i in pageIndexs! {
                
                print(i)
            }
        }
        #endif
//        self.prePDFView.document?.importPages(pageIndexs!, from: self.documentModel.document, at: 0)
        for page in pages! {
            self.prePDFView?.document.insertPageObject(page, at: self.prePDFView!.document.pageCount)
        }
        DispatchQueue.main.async {
            self.prePDFView?.layoutDocumentView()
            self.prePDFView?.setNeedsDisplayForVisiblePages()
            self.prePDFView?.goToFirstPage(nil)
            
            let number: Int = Int(self.prePDFView!.document!.pageCount)
            self.totalNumberLabel.stringValue = "\(number)"
            self.currentPageIndex = 1
            self.numberTextField.stringValue = "1"
            
            self.updateBackAndNextButtonState()
        }
    }
    
    private func getPageIndexs(_ pageRange: KMPageRange, pageString: String = "") -> IndexSet? {
        if (self.documentModel.pageCount <= 0) {
            return nil
        }
        
        let pageCount = self.documentModel.pageCount
        var indexs = IndexSet()
        if (pageRange == .all) {
            for i in 0 ..< pageCount {
                indexs.insert(i)
            }
        } else if (pageRange == .odd) {
            for i in 0 ..< pageCount {
                if ((i % 2) == 1) {
                    continue
                }
                indexs.insert(i)
            }
        } else if (pageRange == .even) {
            for i in 0 ..< pageCount {
                if ((i % 2) == 0) {
                    continue
                }
                indexs.insert(i)
            }
        } else if (pageRange == .current) {
            if (self.currentPageIndex >= 1 && self.currentPageIndex <= pageCount) {
                indexs.insert(self.currentPageIndex-1)
            }
        } else if (pageRange == .custom) {
            let array = self.findSelectPage(pageRangeString: pageString)
            if array.count == 0 {

            } else {
                for i in 0 ..< array.count {
                    let index = array[i]
                    if (index > pageCount || index < 1) {
                        continue
                    }
                    indexs.insert(index-1)
                }
            }
        }
        return indexs
    }
    
    private func getPages(_ pageRange: KMPageRange, pageString: String = "") -> [CPDFPage]? {
        if (self.documentModel.pageCount <= 0) {
            return nil
        }
        
        let pageCount = self.documentModel.pageCount
        var pages: [CPDFPage] = []
        if (pageRange == .all) {
            for i in 0 ..< pageCount {
                let page = self.documentModel.document?.page(at: UInt(i))
                if (page == nil) {
                    continue
                }
                
                pages.append(page!)
            }
        } else if (pageRange == .odd) {
            for i in 0 ..< pageCount {
                if ((i % 2) == 1) {
                    continue
                }
                let page = self.documentModel.document?.page(at: UInt(i))
                if (page == nil) {
                    continue
                }
                
                pages.append(page!)
            }
        } else if (pageRange == .even) {
            for i in 0 ..< pageCount {
                if ((i % 2) == 0) {
                    continue
                }
                let page = self.documentModel.document?.page(at: UInt(i))
                if (page == nil) {
                    continue
                }
                
                pages.append(page!)
            }
        } else if (pageRange == .current) {
            let page = self.prePDFView?.currentPage()
            if (page != nil) {
                pages.append(page!)
            }
        } else if (pageRange == .custom) {
            let array = self.findSelectPage(pageRangeString: pageString)
            if array.count == 0 {

            } else {
                for i in 0 ..< array.count {
                    let index = array[i]
                    if (index > pageCount || index < 1) {
                        continue
                    }
                    let page = self.documentModel.document?.page(at: UInt(index-1))
                    if (page == nil) {
                        continue
                    }
                    
                    pages.append(page!)
                }
            }
        }
        return pages
    }
    
    // MARK: Progress
    func showProgressWindow() {
        let progress = SKProgressController()
        progress.message = NSLocalizedString("Converting...", comment: "")
        progress.window?.backgroundColor = NSColor(hex: "#36383B")
        progress.window?.contentView?.wantsLayer = true
        progress.window?.contentView?.layer?.backgroundColor = NSColor(hex: "#36383B").cgColor
        progress.progressField.textColor = NSColor.white
        
        progress.closeBlock = { [weak self] in
            if (self!.convert != nil) {
                KMPDFConvertManager.defaultManager.cancel(convert: self!.convert!)
            }
        }
        
        self.progressController = progress
        self.window?.beginSheet(progress.window!)
    }
    
    func hiddenProgressWindow() {
        if (self.progressController != nil) {
            self.window?.endSheet((self.progressController?.window)!)
            self.progressController = nil
        }
    }
    
    func getCurrentLanguage() -> String {
//        return Bundle.main.preferredLocalizations.first!
        let array: [String] = UserDefaults.standard.object(forKey: "AppleLanguages") as! [String]
        return array.first!
    }
    
    /// 存储用户的选择的语言
    func saveLanugageSelectedIndex(index: Int) {
        UserDefaults.standard.setValue("\(index)", forKey: kKMConvertLanugageSelectedIndex)
        UserDefaults.standard.synchronize()
    }
}

extension KMConvertBaseWindowController: NSTextFieldDelegate {
    func controlTextDidChange(_ obj: Notification) {
        if numberTextField.isEqual(to: obj.object) {
            let textField: NSTextField = obj.object as! NSTextField
            var value: String = ""
            for ch in textField.stringValue {
                if ch != "0" && ch != "1" && ch != "2" && ch != "3" && ch != "4" && ch != "5" && ch != "6" && ch != "7" && ch != "8" && ch != "9" {

                } else {
                    if value.isEmpty && ch == "0" {
                        
                    } else {
                        value.append(ch)
                    }
                }
            }
            
            if value.isEmpty {
                value.append("1")
            } else {
                if Int(value)! <= 0 {
                    value = "1"
                } else if Int(value)! > self.prePDFView!.document!.pageCount {
                    let number: Int = Int(self.prePDFView!.document!.pageCount)
                    value = "\(number)"
                }
            }
            
            numberTextField.stringValue = value
        }
    }
    
    func controlTextDidEndEditing(_ obj: Notification) {
        if numberTextField.isEqual(to: obj.object) {
            if (numberTextField.stringValue.isEmpty) {
                numberTextField.stringValue = "1"
                self.prePDFView?.go(toPageIndex: 0, animated: false)
                self.currentPageIndex = 1
                
                self.updateBackAndNextButtonState()
                return
            }
            let number: Int = Int(numberTextField.stringValue)!
            if number > 0 && number <= self.prePDFView!.document!.pageCount {
                guard let page = self.prePDFView?.document?.page(at: UInt(number-1)) else {
                    return
                }
                self.prePDFView?.go(to: page)
                currentPageIndex = number
                
                self.updateBackAndNextButtonState()
            }
        }
    }
}

extension KMConvertBaseWindowController: CPDFViewDelegate {
    func pdfViewCurrentPageDidChanged(_ pdfView: CPDFView!) {
        let currentIndex = pdfView.currentPageIndex
        currentPageIndex = currentIndex + 1
        numberTextField.stringValue = "\(currentIndex+1)"
        
        self.updateBackAndNextButtonState()
    }
}