//
//  KMMergeTitleBar.swift
//  PDF Master
//
//  Created by tangchao on 2022/11/23.
//

import Cocoa

enum KMMergeTitleBarButtonID: Int {
    case add = 0
    case delete = 1
    case zoomOut = 2
    case zoomIn = 3
    case merge = 4
    case cancel = 5
}

typealias KMMergeTitleBarItemViewClick = (Int)->()
class KMMergeTitleBarItem: NSView {
    lazy var leftButton = NSButton()
    lazy var rightButton = NSButton()
    
    var itemClick: KMMergeTitleBarItemViewClick!
    
    override init(frame frameRect: NSRect) {
        super.init(frame: frameRect)
        
        addSubview(leftButton)
        addSubview(rightButton)
        
        leftButton.isBordered = false
        rightButton.isBordered = false
        
        leftButton.title = ""
        leftButton.target = self
        leftButton.action = #selector(leftButtonAction)
        rightButton.target = self
        rightButton.action = #selector(rightButtonAction)
    }
    
    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
    override func layout() {
        super.layout()
        
        let width = NSWidth(self.bounds)
        let height = NSHeight(self.bounds)
        
        let leftSize: CGFloat = 18
        leftButton.frame = NSMakeRect(0, (height-leftSize)*0.5, leftSize, leftSize)
        rightButton.frame = NSMakeRect(leftSize, 0, width-leftSize, height)
    }
    
    @objc func leftButtonAction() {
        guard let callback = itemClick else {
            return
        }
        callback(1)
    }
    
    @objc func rightButtonAction() {
        guard let callback = itemClick else {
            return
        }
        callback(2)
    }
}

protocol KMMergeTitleBarDelegate : NSObjectProtocol {
    func titleBar(titleBar: KMMergeTitleBar, itemDidClick: KMMergeTitleBarButtonID)
}

typealias KMMergeTitleBarItemClick = (KMMergeTitleBarButtonID)->()
typealias KMMergeTitleBarPageRangeClick = (_ index: Int, _ pageString: String)->()
class KMMergeTitleBar: NSView {

    lazy var addItem = KMMergeTitleBarItem()
    private lazy var deleteItem = KMMergeTitleBarItem()
    private lazy var vLine = NSView()
    private lazy var zoomOutButton = NSButton()
    private lazy var zoomInButton = NSButton()
    
    private lazy var pagePageComboBox = NSComboBox()
    
    private lazy var mergeButton = NSButton()
    private lazy var cancelButton = NSButton()
    private lazy var bottomLine = NSView()
    
    weak open var delegate: KMMergeTitleBarDelegate?
    var itemClick: KMMergeTitleBarItemClick!
    var pageRangeClick: KMMergeTitleBarPageRangeClick!
    
    private var myModel: KMMergeFileModel!
    var model: KMMergeFileModel {
        get {
            myModel
        }
        set {
            myModel = newValue
            
            if newValue.pageRange == .custom {
                if !newValue.pageRangeString.isEmpty {
                    pagePageComboBox.stringValue = newValue.pageRangeString
                }
                
                pagePageComboBox.isEditable = true
            } else if newValue.pageRange == .all {
                pagePageComboBox.stringValue = NSLocalizedString("全部页面", comment: "")
            } else if newValue.pageRange == .oddPages {
                pagePageComboBox.stringValue = NSLocalizedString("奇数页面", comment: "")
            } else if newValue.pageRange == .evenPages {
                pagePageComboBox.stringValue = NSLocalizedString("偶数页面", comment: "")
            }
        }
    }
    
    deinit {
        /// 释放
    }
    
    override init(frame frameRect: NSRect) {
        super.init(frame: frameRect)
        
        initDefaultValue()
        initSubViews()
    }
    
    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
    override var isFlipped: Bool {
        return true
    }
    
    func initDefaultValue() {
        addItem.wantsLayer = true
        addItem.rightButton.title = NSLocalizedString("新增文件", comment: "")
        
        addItem.itemClick = {
            [weak weakSelf = self] (index: Int) -> () in
            guard let itemClickAction = weakSelf?.itemClick else {
                return
            }
            
            itemClickAction(KMMergeTitleBarButtonID.add)
        }
        
        deleteItem.wantsLayer = true
        deleteItem.rightButton.title = NSLocalizedString("删除", comment: "")
        deleteItem.itemClick = {
            [weak weakSelf = self] (index: Int) -> () in
            guard let itemClickAction = weakSelf?.itemClick else {
                return
            }
            
            itemClickAction(KMMergeTitleBarButtonID.delete)
        }
        
        vLine.wantsLayer = true
        vLine.layer?.backgroundColor = NSColor.lightGray.cgColor
        
        zoomOutButton.wantsLayer = true
        zoomOutButton.isBordered = false
        zoomOutButton.title = "+"
        zoomOutButton.layer?.borderWidth = 1;
        zoomOutButton.layer?.borderColor = NSColor.gray.cgColor;
        zoomOutButton.layer?.cornerRadius = 12
        zoomOutButton.target = self
        zoomOutButton.action = #selector(zoomOutButtonAction)
        
        zoomInButton.wantsLayer = true
        zoomInButton.isBordered = false
        zoomInButton.title = "-"
        zoomInButton.layer?.borderWidth = 1;
        zoomInButton.layer?.borderColor = NSColor.gray.cgColor;
        zoomInButton.layer?.cornerRadius = 12
        zoomInButton.target = self
        zoomInButton.action = #selector(zoomInButtonAction)
        
        pagePageComboBox.stringValue = "全部页面"
        pagePageComboBox.placeholderString = NSLocalizedString("如1,3-5,10", comment: "")
        pagePageComboBox.delegate = self
        pagePageComboBox.isEditable = false
        pagePageComboBox.addItems(withObjectValues: [NSLocalizedString("全部页面", comment: ""),
                                                     NSLocalizedString("奇数页面", comment: ""),
                                                     NSLocalizedString("偶数页面", comment: ""),
                                                     NSLocalizedString("自定义", comment: "")])
        
        mergeButton.wantsLayer = true
        mergeButton.isBordered = false
        mergeButton.title = NSLocalizedString("合并", comment: "")
        mergeButton.attributedTitle = NSMutableAttributedString(string: mergeButton.title, attributes: [NSAttributedString.Key.foregroundColor : NSColor.white])
        mergeButton.layer?.backgroundColor = NSColor.black.cgColor
        mergeButton.layer?.cornerRadius = 5
        mergeButton.target = self
        mergeButton.action = #selector(mergeButtonAction)
        
        cancelButton.wantsLayer = true
        cancelButton.isBordered = false
        cancelButton.title = NSLocalizedString("关闭", comment: "")
        cancelButton.layer?.backgroundColor = NSColor.white.cgColor
        cancelButton.layer?.cornerRadius = 5
        cancelButton.layer?.borderWidth = 1
        cancelButton.layer?.borderColor = NSColor.black.cgColor
        cancelButton.target = self
        cancelButton.action = #selector(cancelButtonAction)
        
        bottomLine.wantsLayer = true
        bottomLine.layer?.backgroundColor = NSColor.lightGray.cgColor
    }
    
    func initSubViews() {
        addSubview(addItem)
        addSubview(deleteItem)
        addSubview(vLine)
        addSubview(zoomOutButton)
        addSubview(zoomInButton)
        addSubview(pagePageComboBox)
        
        addSubview(mergeButton)
        addSubview(cancelButton)
        addSubview(bottomLine)
    }
    
    override func layout() {
        super.layout()
        
        let width = NSWidth(self.bounds)
        let height = NSHeight(self.bounds)
        let space: CGFloat = 12
        
        let centerX: CGFloat = width * 0.5
        let lineH: CGFloat = 18
        vLine.frame = NSMakeRect(centerX, (height-lineH)*0.5, 1, lineH);
        
        let itemH: CGFloat = 28
        let itemY: CGFloat = (height-itemH) * 0.5
        let deleteItemWidth: CGFloat = 60
        let deleteItemX = centerX-deleteItemWidth-space
        deleteItem.frame = NSMakeRect(deleteItemX, itemY, deleteItemWidth, itemH)
        
        let addItemWidth: CGFloat = 80
        let addItemX = deleteItemX-addItemWidth-space
        addItem.frame = NSMakeRect(addItemX, itemY, addItemWidth, itemH)
        
        let zoomButtonSize: CGFloat = 24
        let zoomOutButtonX = centerX + space
        let zoomButtonY = (height-zoomButtonSize) * 0.5
        zoomOutButton.frame = NSMakeRect(zoomOutButtonX, zoomButtonY, zoomButtonSize, zoomButtonSize)
        
        zoomInButton.frame = NSMakeRect(zoomOutButtonX+zoomButtonSize+space, zoomButtonY, zoomButtonSize, zoomButtonSize)
        
        let pagePageH: CGFloat = 24
        let pagePageX: CGFloat = zoomInButton.frame.maxX + 30
        pagePageComboBox.frame = NSMakeRect(pagePageX, (height-pagePageH) * 0.5, 160, pagePageH)
        
        let rightButtonH: CGFloat = 30
        let rightButtonW: CGFloat = 60
        let rightButtonY: CGFloat = (height-rightButtonH)*0.5
        let rightMargin: CGFloat = 28
        let cancelButtonX = width-rightMargin-rightButtonW
        cancelButton.frame = NSMakeRect(cancelButtonX, rightButtonY, rightButtonW, rightButtonH)
        mergeButton.frame = NSMakeRect(cancelButtonX-rightButtonW-12, rightButtonY, rightButtonW, rightButtonH)
        
        bottomLine.frame = NSMakeRect(0, height-1, width, 1)
    }
    
    /**
     * MARK:  - User Action
     */
    
    @objc func addItemAction() {
        guard let itemClickAction = itemClick else {
            return
        }
        
        itemClickAction(KMMergeTitleBarButtonID.add)
    }
    
    @objc func deleteItemAction() {
        guard let itemClickAction = itemClick else {
            return
        }
        
        itemClickAction(KMMergeTitleBarButtonID.delete)
    }
    
    @objc func zoomOutButtonAction() {
        guard let itemClickAction = itemClick else {
            return
        }
        
        itemClickAction(KMMergeTitleBarButtonID.zoomOut)
    }
    
    @objc func zoomInButtonAction() {
        guard let itemClickAction = itemClick else {
            return
        }
        
        itemClickAction(KMMergeTitleBarButtonID.zoomIn)
    }
    
    @objc func mergeButtonAction() {
        guard let itemClickAction = itemClick else {
            return
        }
        
        itemClickAction(KMMergeTitleBarButtonID.merge)
    }
    
    @objc func cancelButtonAction() {
        guard let itemClickAction = itemClick else {
            return
        }
        
        itemClickAction(KMMergeTitleBarButtonID.cancel)
    }
    
    func setDeleteItemEnable(enable: Bool) {
        deleteItem.leftButton.isEnabled = enable
        deleteItem.rightButton.isEnabled = enable
    }
    
    func setZoomItemEnable(zoomIn: Bool, enable: Bool) {
        if zoomIn {
            zoomInButton.isEnabled = enable
        } else {
            zoomOutButton.isEnabled = enable
        }
    }
    
    func setPageRangeComboBoxHidden(isHidden: Bool) {
        pagePageComboBox.isHidden = isHidden
    }
    
    func setPagePageComboBoxString(string: String) {
        pagePageComboBox.stringValue = string
    }
}

extension KMMergeTitleBar: NSComboBoxDelegate {
    func comboBoxSelectionDidChange(_ notification: Notification) {
        if notification.object as! NSComboBox != pagePageComboBox {
            return
        }
        
        let box: NSComboBox = notification.object as! NSComboBox
        let index = box.indexOfSelectedItem
        if index < 0 {
            return
        }
        
        if index == 3 {
            pagePageComboBox.isEditable = true
            pagePageComboBox.stringValue = "如1,3-5,10"
            self.window?.makeFirstResponder(pagePageComboBox)
        } else {
            pagePageComboBox.isEditable = false
            guard let callback = pageRangeClick else {
                return
            }
            
            callback(index, "")
        }
    }
    
    func controlTextDidEndEditing(_ obj: Notification) {
        if obj.object as! NSComboBox != pagePageComboBox {
            return
        }
        
        let box: NSComboBox = obj.object as! NSComboBox
        
        pagePageComboBox.isEditable = false
        guard let callback = pageRangeClick else {
            return
        }
        
        callback(3, pagePageComboBox.stringValue)
    }
}