//
//  KMDesignBaseView.swift
//  PDF Reader Pro
//
//  Created by tangchao on 2023/6/7.
//

import Cocoa

@objc enum KMDesignSize: Int {
    case large      = 0     // 大
    case medium     = 1     // 中
    case small      = 2     // 小
}

typealias KMDesignTokenKey = String

let KMDesignTokenNone: KMDesignTokenKey = ""

private let KMHorizDividerTokenKey: KMDesignTokenKey         = "divider.horiz"
private let KMVertDividerTokenKey: KMDesignTokenKey          = "divider.vert"

// 组件 基类
class KMDesignBaseView: NSView {
    public static let horDividerToken = KMHorizDividerTokenKey
    public static let verDividerToken = KMVertDividerTokenKey
    
    var height: CGFloat = 0.0
    var horizontalPadding: CGFloat = 0.0
    var borderColor: NSColor = .clear
    var borderRadius: CGFloat = 4.0
    var borderWidth: CGFloat = 1.0
    var fillColor: NSColor = .clear
    
    var textColor: NSColor = .black
    var fontName: String = "SFProText-Regular"
    var fontSize: CGFloat = 0.0
    
    var state: KMDesignTokenState = .Norm {
        didSet {
            self.updateUI(state: self.state)
        }
    }
    var kmEnabled = true {
        didSet {
            if (self.kmEnabled) {
                self.state = .Norm
            } else {
                self.state = .Disabled
            }
        }
    }
    
    override init(frame frameRect: NSRect) {
        super.init(frame: frameRect)
        
        self.initSubViews()
        self.initDefaultValue()
    }
    
    required init?(coder: NSCoder) {
        super.init(coder: coder)
        
        self.initSubViews()
        self.initDefaultValue()
    }
    
    func initSubViews() {}
    func initDefaultValue() {}
    
    func find_bgToken(state: KMDesignTokenState) -> KMDesignTokenKey { return KMDesignTokenNone }
    func find_textToken(state: KMDesignTokenState) -> KMDesignTokenKey { return KMDesignTokenNone }
    func find_spaceToken(state: KMDesignTokenState) -> KMDesignTokenKey { return KMDesignTokenNone }
    
    func updateUI(state: KMDesignTokenState) {
        let bgToken = self.find_bgToken(state: state)
        if (bgToken.isEmpty) {
            KMPrint("bgToken invalid.")
        } else {
            let model = KMDesignToken.shared.tokenUsesModel(withToken: bgToken)
            if let data = model.border as? String {
                self.borderColor = NSColor.km_init(hex: data)
            }
            if let data = model.borderRadius as? String, let _value = Float(data) {
                self.borderRadius = CGFloat(_value)
            }
            if let data = model.borderWidth as? String, let _value = Float(data) {
                self.borderWidth = CGFloat(_value)
            }
            if let data = model.fill as? String {
                self.fillColor = NSColor.km_init(hex: data)
            }
        }
        
        let textToken = self.find_textToken(state: state)
        if (!textToken.isEmpty) {
            let model = KMDesignToken.shared.tokenUsesModel(withToken: textToken)
            if let data = model.fill as? String {
                self.textColor = NSColor.km_init(hex: data)
            }
            
            let tModel = KMDesignToken.shared.typography(withToken: textToken)
            if let _fontSize = Float(tModel.fontSize) {
                self.fontSize = CGFloat(_fontSize)
            }
            var fontName: String = ""
            fontName.append(tModel.fontFamily.isEmpty ? "SFProText" : tModel.fontFamily)
            fontName.append("-")
            fontName.append(tModel.fontWeight.isEmpty ? "Regular" : tModel.fontWeight)
            // 去掉多余的空格
            fontName = fontName.replacingOccurrences(of: " ", with: "")
            self.fontName = fontName
        }
        
    }
    
    func canHover() -> Bool {
        if (self.state == .Norm || self.state == .Hov || self.state == .None) {
            return true
        }
        return false
    }
    
    // MARK: - divider
    
    func horDividerHeight() -> CGFloat {
        let height = KMDesignToken.shared.height(withToken: KMHorizDividerTokenKey)
        if let _height = Float(height) {
            return CGFloat(_height)
        }
        return 0
    }
    func horDividerColor() -> NSColor {
        return KMDesignToken.shared.fill(withToken: KMHorizDividerTokenKey)
    }
    
    func verDividerWidth() -> CGFloat {
        let width = KMDesignToken.shared.width(withToken: KMVertDividerTokenKey)
        if let _width = Float(width) {
            return CGFloat(_width)
        }
        return 0
    }
    func verDividerColor() -> NSColor {
        return KMDesignToken.shared.fill(withToken: KMVertDividerTokenKey)
    }
}