//
//  KMConvertPageRangeSettingItemView.swift
//  PDF Reader Pro
//
//  Created by tangchao on 2022/12/6.
//

import Cocoa
import KMComponentLibrary

typealias KMConvertPageRangeSettingItemViewTextDidEndEditing = (_ textString: String) -> ()
class KMConvertPageRangeSettingItemView: KMConvertBaseView {
    
    @IBOutlet weak var titleLabel: NSTextField!
    @IBOutlet weak var pageSizeComboBox: NSComboBox!
    @IBOutlet weak var pageSizeBox: NSBox!

    @IBOutlet weak var pagesizeBoxHeight: NSLayoutConstraint!
    
    var pageSizeVC: KMDesignSelect?

    var pageRangeValue: String = ""
    
    var itemClick: KMCommonClickBlock?
    var textDidEndEditingCallback: KMConvertPageRangeSettingItemViewTextDidEndEditing?
    
    var isTextDidEndCallback: Bool = false
    var pageCount = 0
    
    private lazy var pageRangeView_: ComponentSelect = {
        let view = ComponentSelect()
        
        view.properties = ComponentSelectProperties(size: .s,
                                                                state: .normal,
                                                                isDisabled: false,
                                                                isError: false,
                                                                leftIcon: false,
                                                                placeholder: nil,
                                                                errorText: nil,
                                                                creatable: false,
                                                                text: KMLocalizedString("Odd Pages Only", comment: ""))
        view.delegate = self
        return view
    }()
    
    override func initSubViews() {
        super.initSubViews()
        
        self.pageSizeBox.contentView = self.pageRangeView_
        
        let strings = [KMTools.pageRangeTypeString(pageRange: .all),
                       KMTools.pageRangeTypeString(pageRange: .current),
                       KMTools.pageRangeTypeString(pageRange: .odd),
                       KMTools.pageRangeTypeString(pageRange: .even),
                       KMTools.pageRangeTypeString(pageRange: .custom)]
        var menuItemArr: [ComponentMenuitemProperty] = []
        for str in strings {
            let itemProperty: ComponentMenuitemProperty = ComponentMenuitemProperty(multipleSelect: false,
                                                                                    itemSelected: false,
                                                                                    isDisabled: false,
                                                                                    keyEquivalent: nil,
                                                                                    text: str)
            menuItemArr.append(itemProperty)
        }

        
        pageRangeView_.updateMenuItemsArr(menuItemArr)
        
        pageRangeView_.selectItemAtIndex(0)
        pageRangeView_.properties.creatable = false
        pageRangeView_.properties.text = menuItemArr.first?.text
        pageRangeView_.reloadData()
    }
    
    override func initDefaultVlaue() {
        super.initDefaultVlaue()
        
        self.pageSizeBox.fillColor = .clear
        
        self.titleLabel.stringValue = KMLocalizedString("Page Range", comment: "")
        self.titleLabel.textColor = NSColor.km_init(hex: "#616469")
        self.titleLabel.font = .SFProTextSemiboldFont(12)
    }
}

extension KMConvertPageRangeSettingItemView: KMSelectPopButtonDelegate {
    func km_controlTextDidChange(_ obj: KMDesignSelect) {
        if let vc = self.pageSizeVC {
            self.pageRangeValue = vc.stringValue
        }
    }
    
    func km_controlTextDidEndEditing(_ obj: KMDesignSelect) {
        guard let vc = self.pageSizeVC else {
            return
        }
        
        if (!self.isTextDidEndCallback) {
            return
        }
        if (vc.indexOfSelectedItem != (vc.numberOfItems-1)) {
            /// 其他item切换
            return
        }
        guard let callback = self.textDidEndEditingCallback else {
            return
        }
        callback(vc.stringValue)
    }
    
    func km_comboBoxSelectionDidChange(_ obj: KMDesignSelect) {
        guard let vc = self.pageSizeVC else {
            return
        }

        let index = vc.indexOfSelectedItem
        if index < 0 {
            return
        }

        if index == vc.numberOfItems-1 {
            self.pageSizeVC?.editable = true
            DispatchQueue.main.async { 
                self.pageSizeVC?.stringValue = ""
            }
            self.window?.makeFirstResponder(self.pageSizeVC?.textField)
        } else {
            self.window?.makeFirstResponder(nil)
            self.pageSizeVC?.editable = false
        }

        guard let callback = self.itemClick else {
            return
        }
        callback(index)
    }
    
    func km_SelectPopoverWillShow(_ obj: KMDesignSelect) {
        if (self.pageCount <= 1) {
            self.pageSizeVC?.disItems = [KMTools.pageRangeTypeString(pageRange: .even)]
        } else {
            self.pageSizeVC?.disItems = []
        }
    }
}

extension KMConvertPageRangeSettingItemView: ComponentSelectDelegate {
    func componentSelectDidSelect(view: ComponentSelect?, menuItemProperty: ComponentMenuitemProperty?) {
        if(view == pageRangeView_) {
            let pageRangeSelectIndex = pageRangeView_.indexOfSelect()
            var isEditIndex:Int = 4

            if (pageRangeSelectIndex == isEditIndex) {
                pageRangeView_.properties.text = ""

                pageRangeView_.properties.placeholder = KMLocalizedString("e.g. 1,3-5,10")
                pageRangeView_.properties.creatable = true
            } else {
                pageRangeView_.properties.placeholder = ""
                pageRangeView_.properties.creatable = false
            }
            pageRangeView_.reloadData()
            
            guard let callback = self.itemClick else {
                return
            }
            callback(pageRangeSelectIndex)
        }
    }
    
    func componentSelectTextDidEndEditing(_ view: ComponentSelect) {
        guard let callback = self.textDidEndEditingCallback else {
            return
        }
        callback(view.properties.text ?? "")
    }
}