//
//  KMBatesPropertyInfoController.swift
//  PDF Reader Pro
//
//  Created by tangchao on 2022/12/28.
//

import Cocoa
/// Bates 属性控制器
class KMBatesPropertyInfoController: NSViewController {

    @IBOutlet weak var scrollView: NSScrollView!
    
    @IBOutlet weak var fontBox: NSBox!
    @IBOutlet weak var marginBox: NSBox!
    @IBOutlet weak var preSufFixBox: NSBox!
    @IBOutlet weak var pageBox: NSBox!
    @IBOutlet weak var contentBox: NSBox!
    @IBOutlet weak var pageRangeBox: NSBox!
    
    var fontView = KMHeaderFooterFontInfoView()
    var marginView = KMHeaderFooterMarginInfoView()
    var preFixView = KMBatesPrefixInfoView()
    var pageView = KMBatesPageInfoView()
    var contentView = KMHeaderFooterContentInfoView()
    var pagePageView = KMConvertPageRangeSettingItemView.createFromNib()
    
    weak var delegate: KMWatermarkAdjectivePropertyDelegate!
    
    init() {
        super.init(nibName: "KMBatesPropertyInfoController", bundle: nil)
    }
    
    required init?(coder: NSCoder) {
        super.init(nibName: "KMBatesPropertyInfoController", bundle: nil)
    }
    
    private var myModel: KMHeaderFooterObject!
    var model: KMHeaderFooterObject {
        get {
            return myModel
        }
        set {
            myModel = newValue
            
            self.fontView.model = newValue
            self.marginView.model = newValue
            self.preFixView.model = newValue
            
            self.pageView.leftStepper.value = Double(newValue.batesDigits)
            self.pageView.rightComboBox.removeAllItems()
            for i in 0 ..< newValue.pageCount {
                self.pageView.rightComboBox.addItem(withObjectValue: i+1)
            }
            self.pageView.rightComboBox.stringValue = newValue.startString
            
            self.contentView.model = newValue
        }
    }
    
    override func viewWillAppear() {
        super.viewWillAppear()
        
        /// 滚动到顶部
        DispatchQueue.main.async {
            let contentView = self.scrollView.contentView;
            contentView.scroll(to: NSMakePoint(0, NSHeight(self.scrollView.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 = { [unowned 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 preFixView = self.preFixView
        preFixView.frame = self.preSufFixBox.contentView!.bounds
        preFixView.autoresizingMask = NSView.AutoresizingMask(rawValue: 18)
        self.preSufFixBox.contentView?.addSubview(preFixView)
        preFixView.itemClick = { [weak self] (index: Int, value: Any) in
            if (index == 1) {
                self!.model.batesPrefixString = value as! String
            } else if (index == 2) {
                self!.model.batesSuffixString = 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.itemClick = { [weak self] (index: Int, value: Any) in
            if (index == 1) { /// 位数
                self!.model.batesDigits = Int(value as! Double)
            } 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 = { [self]
            (index: Int, sender: NSButton) in
            
            var string: String = "<<#\(self.model.batesDigits)"
            string.append("#\(self.model.startString)")
            
            if (!self.model.batesPrefixString.isEmpty) {
                string.append("#\(self.model.batesPrefixString)")
            } else if (!self.model.batesSuffixString.isEmpty) {
                string.append("#")
            }
            
            if (!self.model.batesSuffixString.isEmpty) {
                string.append("#\(self.model.batesSuffixString)")
            }
            string.append(">>")
            
            self.contentView.textView.string = "\(self.contentView.textView.string)".appending(string)
            
            self.updateModelForContentInfo(index: index, value: self.contentView.textView.string)
        }
        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)
            }
        }
    }
    
    @objc private 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)
        }
    }
    
    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)
        }
    }
    
}