//
//  KMHeaderFooterPropertyInfoController.swift
//  Cisdem PDFMaster
//
//  Created by tangchao on 2022/12/27.
//

import Cocoa

class KMHeaderFooterPropertyInfoController: NSViewController {
    
    @IBOutlet weak var fontBox: NSBox!
    var fontView = KMHeaderFooterFontInfoView()
    @IBOutlet weak var marginBox: NSBox!
    var marginView = KMHeaderFooterMarginInfoView()
    @IBOutlet weak var dateBox: NSBox!
    var dateView = KMHeaderFooterDateInfoView()
    @IBOutlet weak var pageBox: NSBox!
    var pageView = KMHeaderFooterPageInfoView()
    @IBOutlet weak var contentBox: NSBox!
    var contentView = KMHeaderFooterContentInfoView()
    @IBOutlet weak var pageRangeBox: NSBox!
    
    var pagePageView = KMConvertPageRangeSettingItemView.createFromNib()
    
    weak var delegate: KMWatermarkAdjectivePropertyDelegate!
    
    init() {
        super.init(nibName: "KMHeaderFooterPropertyInfoController", bundle: nil)
    }
    
    required init?(coder: NSCoder) {
        super.init(nibName: "KMHeaderFooterPropertyInfoController", bundle: nil)
    }
    
    private var myModel: KMHeaderFooterObject!
    var model: KMHeaderFooterObject {
        get {
            return myModel
        }
        set {
            myModel = newValue
            
            self.fontView.model = newValue
            self.marginView.model = newValue
            self.dateView.model = newValue
            
            self.pageView.leftComboBox.removeAllItems()
            self.pageView.leftComboBox.addItems(withObjectValues: KMWatermarkAdjectiveTools.getPageFormats())
            if (newValue.pageFormatString.isEmpty) {
                self.pageView.leftComboBox.stringValue = KMWatermarkAdjectiveTools.getPageFormats().first!
            } else {
                self.pageView.leftComboBox.stringValue = newValue.pageFormatString
            }
            self.pageView.rightComboBox.removeAllItems()
            for i in 0 ..< newValue.pageCount {
                self.pageView.rightComboBox.addItem(withObjectValue: i+1)
            }
            
            if (newValue.startString.isEmpty) {
                self.pageView.rightComboBox.stringValue = "1"
            } else {
                self.pageView.rightComboBox.stringValue = newValue.startString
            }
            
            self.contentView.model = newValue
        }
    }
    
    override func viewWillAppear() {
        super.viewWillAppear()
        
        /// 滚动到顶部
        DispatchQueue.main.async {
            let contentView = self.fontBox.enclosingScrollView!.contentView;
            contentView.scroll(to: NSMakePoint(0, NSHeight(self.fontBox.enclosingScrollView!.documentView!.frame)-NSHeight(contentView.frame)))
        }
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        let fontView = self.fontView
        fontView.frame = self.fontBox.contentView!.bounds
        fontView.autoresizingMask = NSView.AutoresizingMask(rawValue: 18)
        self.fontBox.contentView?.addSubview(fontView)
        fontView.itemClick = { [weak self] (index: Int, value: Any) in
            if (index == 1) { /// 字体名称
                switch self!.model.textFont {
                case .font(name: _, size: let size):
                    self!.model.textFont = .font(name: value as! String, size: size)
                default:
                    break
                }
                
                if (self!.delegate != nil) {
                    self!.delegate.propertyInfoDidChange(model: self!.model)
                }
            } else if (index == 2) { /// 字体大小
                switch self!.model.textFont {
                case .font(name: let name, size: _):
                    self!.model.textFont = .font(name: name, size: CGFloat(value as! Int))
                default:
                    break
                }
                
                if (self!.delegate != nil) {
                    self!.delegate.propertyInfoDidChange(model: self!.model)
                }
            } else if (index == 3) { /// 字体颜色
                let panel = NSColorPanel.shared
                panel.setTarget(self!)
                panel.setAction(#selector(self!.colorPanelAction))
                panel.orderFront(nil)
            }
        }
        
        let marginView = self.marginView
        marginView.frame = self.marginBox.contentView!.bounds
        marginView.autoresizingMask = NSView.AutoresizingMask(rawValue: 18)
        self.marginBox.contentView?.addSubview(marginView)
        marginView.itemClick = { [weak self] (index: Int, value: Any) in
            if (index == 1) { /// top
                self!.model.topMargin = value as! Int
            } else if (index == 2) { /// bottom
                self!.model.bottomMargin = value as! Int
            } else if (index == 3) { /// left
                self!.model.leftMargin = value as! Int
            } else if (index == 4) { /// right
                self!.model.rightMargin = value as! Int
            }
            
            if (self!.delegate != nil) {
                self!.delegate.propertyInfoDidChange(model: self!.model)
            }
        }
        
        let dateView = self.dateView
        dateView.frame = self.dateBox.contentView!.bounds
        dateView.autoresizingMask = NSView.AutoresizingMask(rawValue: 18)
        self.dateBox.contentView?.addSubview(dateView)
        dateView.itemClick = { [weak self] (index: Int, value: Any) in
            
            self!.model.dateFormatString = value as! String
            if (self!.delegate != nil) {
                self!.delegate.propertyInfoDidChange(model: self!.model)
            }
        }
        
        let pageView = self.pageView
        pageView.frame = self.pageBox.contentView!.bounds
        pageView.autoresizingMask = NSView.AutoresizingMask(rawValue: 18)
        self.pageBox.contentView?.addSubview(pageView)
        pageView.leftLabel.stringValue = NSLocalizedString("Page:", comment: "")
        pageView.itemClick = { [weak self] (index: Int, value: Any) in
            if (index == 1) { /// 页面
                self!.model.pageFormatString = KMWatermarkAdjectiveTools.getPageFormats()[value as! Int]
            } else if (index == 2) { /// 起始页
                self!.model.startString = "\(value as! Int+1)"
            }
            if (self!.delegate != nil) {
                self!.delegate.propertyInfoDidChange(model: self!.model)
            }
        }
        
        let contentView = self.contentView
        contentView.frame = self.contentBox.contentView!.bounds
        contentView.autoresizingMask = NSView.AutoresizingMask(rawValue: 18)
        self.contentBox.contentView?.addSubview(contentView)
        contentView.addAction = { [weak self]
            (index: Int, sender: NSButton) in
            let menu = NSMenu()
            let item = menu.addItem(withTitle: NSLocalizedString("Insert Page Number", comment: ""), action: #selector(self!.insertPageAction), keyEquivalent: "")
            item.target = self
            let item2 = menu.addItem(withTitle: NSLocalizedString("Insert Date", comment: ""), action: #selector(self!.insertDateAction), keyEquivalent: "")
            item2.target = self
            menu.popUp(positioning: nil, at: NSPoint(x: sender.bounds.midX, y: sender.bounds.maxY), in: sender)
        }
        contentView.itemClick = { [weak self] (index: Int, value: Any) in
            self!.updateModelForContentInfo(index: index, value: value as! String)
        }
        
        let pageRangeView = self.pagePageView
        pageRangeView?.frame = self.pageRangeBox.contentView!.bounds
        pageRangeView?.autoresizingMask = NSView.AutoresizingMask(rawValue: 18)
        self.pageRangeBox.contentView?.addSubview(pageRangeView!)
        pageRangeView!.pageSizeComboBox.removeAllItems()
        pageRangeView!.pageSizeComboBox.addItems(withObjectValues: [NSLocalizedString("All Pages", comment: ""), NSLocalizedString("Odd Pages", comment: ""), NSLocalizedString("Even Pages", comment: ""), NSLocalizedString("Customized", comment: "")])
        pageRangeView!.pageSizeComboBox.selectItem(at: 0)
        
        pageRangeView?.isTextDidEndCallback = true
        
        pageRangeView?.itemClick = { [unowned self] index, _ in
            self.model.pageRangeType = KMWatermarkeModelPageRangeType(rawValue: index)!
            
            if (self.delegate != nil) {
                self.delegate.propertyInfoDidChange(model: self.model)
            }
        }
        
        pageRangeView?.textDidEndEditingCallback = { [weak self] (textString: String) in
            let array = KMPageRangeTools.findSelectPage(pageRangeString: textString, pageCount: self!.model.pageCount)
            if (array.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
            }

            var pageString: String = ""
            for i in 0 ..< array.count {
                pageString.append("\(array[i]-1)")

                if (i != array.count-1) {
                    pageString.append(",")
                }
            }
            self!.model.pageRangeString = pageString
            
            if (self!.delegate != nil) {
                self!.delegate.propertyInfoDidChange(model: self!.model)
            }
        }
    }
    
    private func updateModelForContentInfo(index: Int, value: String) {
        if (index == 1) {
            self.model.topLeftString = value
        } else if (index == 2) {
            self.model.topCenterString = value
        } else if (index == 3) {
            self.model.topRightString = value
        } else if (index == 4) {
            self.model.bottomLeftString = value
        } else if (index == 5) {
            self.model.bottomCenterString = value
        } else if (index == 6) {
            self.model.bottomRightString = value
        }
        
        if (self.delegate != nil) {
            self.delegate.propertyInfoDidChange(model: self.model)
        }
    }
    
    @objc func colorPanelAction(sender: NSColorPanel) {
        let color = KMWatermarkAdjectiveTools.parseColor(color: sender.color)
        self.model.textColor = .color(red: color.red, green: color.green, blue: color.blue, alpha: color.alpha)
        
        self.fontView.colorView.layer?.backgroundColor = sender.color.cgColor
        if (self.delegate != nil) {
            self.delegate.propertyInfoDidChange(model: self.model)
        }
    }

    @objc private func insertPageAction(sender: NSMenuItem) {
        let string: String = "<<\(self.pageView.leftComboBox.stringValue)>>"
        self.contentView.textView.string = "\(self.contentView.textView.string)".appending(string)
        self.updateModelForContentInfo(index: self.contentView.indexForSelectedItem, value: self.contentView.textView.string)
    }
    
    @objc private func insertDateAction(sender: NSMenuItem) {
        let string: String = "<<\(self.myModel.dateFormatString)>>"
        self.contentView.textView.string = "\(self.contentView.textView.string)".appending(string)
        self.updateModelForContentInfo(index: self.contentView.indexForSelectedItem, value: self.contentView.textView.string)
    }
}