//
//  KMAliasLightParser.swift
//  PDF Reader Pro
//
//  Created by wanjun on 2022/12/21.
//

import Cocoa

class KMAliasLightParser: KMBaseParser {
    func startParse() -> KMAliasLight {
        self.fileName = "alias-light"
        self.fileType = "json"
        return aliasLightParser(self.jsonParser)
    }
    
    func aliasLightParser(_ jsonData: [String: Any]) -> KMAliasLight {
        let data = jsonData
        let allKey = data.keys
        
        let aliasLightModel = KMAliasLight.init()
        if allKey.contains("spacing") {
            aliasLightModel.spacing = ["spacing" : spacingNodeParser((data["spacing"] as! [String : Any]))]
        }
        if allKey.contains("color") {
            aliasLightModel.color = ["color" : colorNodeParser((data["color"] as! [String : Any]))]
        }
        if allKey.contains("radius") {
            aliasLightModel.radius = ["radius" : radiusNodeParser((data["radius"] as! [String : Any]))]
        }
        if allKey.contains("text") {
            aliasLightModel.text = ["text" : textNodeParser((data["text"] as! [String : Any]))]
        }
        if allKey.contains("shadow") {
            aliasLightModel.shadow = ["shadow" : shadowNodeParser((data["shadow"] as! [String : Any]))]
        }
        return aliasLightModel
    }
        
    // MARK: spacing
    
    func spacingNodeParser(_ jsonData: [String: Any]) -> KMAliasLight_spacing {
        let allKey = jsonData.keys
        let model = KMAliasLight_spacing.init()
        if allKey.contains("base") {
            model.base = ["base" : spacingSubNodeParser(jsonData["base"] as! [String : Any])]
        }
        if allKey.contains("tree") {
            model.tree = ["tree" : numberNodeParser(jsonData["tree"] as! [String : Any])]
        }
        return model
    }
    
    // MARK: color
    
    func colorNodeParser(_ jsonData: [String: Any]) -> KMAliasLight_color {
        let allKey = jsonData.keys
        let model = KMAliasLight_color.init()
        if allKey.contains("btn") {
            model.btn = ["btn" : controlNodeParser(jsonData["btn"] as! [String : Any])]
        }
        if allKey.contains("sys") {
            model.sys = ["sys" : controlNodeParser(jsonData["sys"] as! [String : Any])]
        }
        if allKey.contains("item-state") {
            model.item_state = ["item-state" : controlNodeParser(jsonData["item-state"] as! [String : Any])]
        }
        if allKey.contains("field") {
            model.field = ["field" : attributeNodeParser(jsonData["field"] as! [String : Any])]
        }
        if allKey.contains("slider") {
            model.slider = ["slider" : attributeNodeParser(jsonData["slider"] as! [String : Any])]
        }
        if allKey.contains("icon") {
            model.icon = ["icon" : color_icon_baseParser(jsonData["icon"] as! [String : Any])]
        }
        if allKey.contains("badge") {
            let subData = jsonData["badge"] as! [String : Any]
            let subKeys = subData.keys
            let submodel = KMAliasLight_control.init()
            if subKeys.contains("red") {
                submodel.red = ["red" : attributeNodeParser2(subData["red"] as! [String : Any])]
            }
            model.badge = ["badge" : submodel]

        }
        return model
    }
    
    func color_icon_baseParser(_ jsonData: [String: Any]) -> KMAliasLight_attribute {
        let allKey = jsonData.keys
        let model = KMAliasLight_attribute.init()
        if allKey.contains("neutral") {
            model.neutral = ["neutral" : color_icon_base_neutralParser(jsonData["neutral"] as! [String : Any])]
        }
        if allKey.contains("brand") {
            model.brand = ["brand" : valueTypeParser(jsonData["brand"] as! [String : Any])]
        }
        if allKey.contains("accent") {
            model.accent = ["accent" : valueTypeParser(jsonData["accent"] as! [String : Any])]
        }
        if allKey.contains("state") {
            model.state = ["state" : stateParser(jsonData["state"] as! [String : Any])]
        }
        if allKey.contains("anti") {
            model.anti = ["anti" : stateParser(jsonData["anti"] as! [String : Any])]
        }
        return model
    }
    
    func color_icon_base_neutralParser(_ jsonData: [String: Any]) -> KMAliasLight_state {
        let allKey = jsonData.keys
        let model = KMAliasLight_state.init()
        if allKey.contains("norm") {
            model.norm = ["norm" : lvParser(jsonData["norm"] as! [String : Any])]
        }
        if allKey.contains("sel") {
            model.sel = ["sel" : valueTypeParser(jsonData["sel"] as! [String : Any])]
        }
        if allKey.contains("dis") {
            model.dis = ["dis" : valueTypeParser(jsonData["dis"] as! [String : Any])]
        }
        return model
    }
        
    // MARK: radius

    func radiusNodeParser(_ jsonData: [String: Any]) -> KMAliasLight_radius {
        let allKey = jsonData.keys
        let model = KMAliasLight_radius.init()
        if allKey.contains("base") {
            model.base = ["base" : sizeParser(jsonData["base"] as! [String : Any])]
        }
        if allKey.contains("fullround-btn") {
            model.fullround_btn = ["fullround-btn" : sizeParser(jsonData["fullround-btn"] as! [String : Any])]
        }
        return model
    }
     
    // MARK: text

    func textNodeParser(_ jsonData: [String: Any]) -> KMAliasLight_text {
        let allKey = jsonData.keys
        let model = KMAliasLight_text.init()
        if allKey.contains("mac") {
            let subData = jsonData["mac"] as! [String : Any]
            let subKeys = subData.keys
            let submodel = KMAliasLight_attribute.init()
            if subKeys.contains("footnote") {
                submodel.footnote = ["footnote" : attributeNodeParser2(subData["footnote"] as! [String : Any])]
            }
            if subKeys.contains("body") {
                submodel.body = ["body" : sizeParser(subData["body"] as! [String : Any])]
            }
            if subKeys.contains("title") {
                submodel.title = ["title" : sizeParser(subData["title"] as! [String : Any])]
            }
            model.mac = ["fullround-btn" : submodel]
        }
        if allKey.contains("win") {
            let subData = jsonData["win"] as! [String : Any]
            let subKeys = subData.keys
            let submodel = KMAliasLight_attribute.init()
            if subKeys.contains("footnote") {
                submodel.footnote = ["footnote" : attributeNodeParser2(subData["footnote"] as! [String : Any])]
            }
            if subKeys.contains("body") {
                submodel.body = ["body" : sizeParser(subData["body"] as! [String : Any])]
            }
            if subKeys.contains("title") {
                submodel.title = ["title" : sizeParser(subData["title"] as! [String : Any])]
            }
            model.win = ["fullround-btn" : submodel]
        }
        return model
    }
    
    // MARK: shadow

    func shadowNodeParser(_ jsonData: [String: Any]) -> KMAliasLight_shadow {
        let allKey = jsonData.keys
        let model = KMAliasLight_shadow.init()
        if allKey.contains("neutral") {
            model.neutral = ["neutral" : sizeParser(jsonData["neutral"] as! [String : Any])]
        }
        if allKey.contains("accent") {
            model.accent = ["accent" : sizeParser(jsonData["accent"] as! [String : Any])]
        }
        if allKey.contains("error") {
            model.error = ["error" : sizeParser(jsonData["error"] as! [String : Any])]
        }
        return model
    }

    // MARK: - sub node
    
    func controlNodeParser(_ jsonData: [String: Any]) -> KMAliasLight_control {
        let allKey = jsonData.keys
        let model = KMAliasLight_control.init()
        if allKey.contains("cta") {
            model.cta = ["cta" : attributeNodeParser(jsonData["cta"] as! [String : Any])]
        }
        if allKey.contains("brand") {
            model.brand = ["brand" : attributeNodeParser(jsonData["brand"] as! [String : Any])]
        }
        if allKey.contains("sec") {
            let subData = jsonData["sec"] as! [String : Any]
            let subKeys = subData.keys
            let submodel = KMAliasLight_attribute.init()
            if subKeys.contains("border-color") {
                submodel.border_color = ["border-color" : valueTypeParser(subData["border-color"] as! [String : Any])]
            }
            if subKeys.contains("bg") {
                submodel.bg = ["bg" : stateParser(subData["bg"] as! [String : Any])]
            }
            if subKeys.contains("text") {
                submodel.text = ["text" : stateParser(subData["text"] as! [String : Any])]
            }
            model.sec = ["sec" : submodel]
        }
        if allKey.contains("icon-fill") {
            model.icon_fill = ["icon-fill" : attributeNodeParser(jsonData["icon-fill"] as! [String : Any])]
        }
        if allKey.contains("ghost") {
            model.ghost = ["ghost" : attributeNodeParser(jsonData["ghost"] as! [String : Any])]
        }
        if allKey.contains("link") {
            model.link = ["link" : attributeNodeParser(jsonData["link"] as! [String : Any])]
        }
        if allKey.contains("upgrade") {
            model.upgrade = ["upgrade" : attributeNodeParser(jsonData["upgrade"] as! [String : Any])]
        }
        if allKey.contains("text") {
            model.text = ["text" : attributeNodeParser(jsonData["text"] as! [String : Any])]
        }
        if allKey.contains("border") {
            let subData = jsonData["border"] as! [String : Any]
            let subKeys = subData.keys
            let submodel = KMAliasLight_attribute.init()
            if subKeys.contains("error") {
                submodel.error = ["error" : valueTypeParser(subData["error"] as! [String : Any])]
            }
            if subKeys.contains("neutral") {
                submodel.neutral = ["neutral" : stateParser(subData["neutral"] as! [String : Any])]
            }
            if subKeys.contains("accent") {
                submodel.accent = ["accent" : stateParser(subData["accent"] as! [String : Any])]
            }
            model.border = ["border" : submodel]
        }
        if allKey.contains("layout") {
            let subData = jsonData["layout"] as! [String : Any]
            let subKeys = subData.keys
            let submodel = KMAliasLight_attribute.init()
            if subKeys.contains("bg") {
                submodel.bg = ["bg" : stateParser(subData["bg"] as! [String : Any])]
            }
            if subKeys.contains("mg") {
                submodel.mg = ["mg" : valueTypeParser(subData["mg"] as! [String : Any])]
            }
            if subKeys.contains("fg") {
                submodel.fg = ["fg" : stateParser(subData["fg"] as! [String : Any])]
            }
            if subKeys.contains("dark") {
                submodel.dark = ["dark" : stateParser(subData["dark"] as! [String : Any])]
            }
            if subKeys.contains("state") {
                submodel.state = ["state" : stateParser(subData["state"] as! [String : Any])]
            }
            if subKeys.contains("anti") {
                submodel.anti = ["anti" : valueTypeParser(subData["anti"] as! [String : Any])]
            }
            if subKeys.contains("accent") {
                submodel.accent = ["accent" : valueTypeParser(subData["accent"] as! [String : Any])]
            }
            if subKeys.contains("brand") {
                submodel.brand = ["brand" : valueTypeParser(subData["brand"] as! [String : Any])]
            }
            if subKeys.contains("divider") {
                submodel.divider = ["divider" : valueTypeParser(subData["divider"] as! [String : Any])]
            }
            model.layout = ["layout" : submodel]
        }
        if allKey.contains("sel") {
            model.sel = ["sel" : attributeNodeParser(jsonData["sel"] as! [String : Any])]
        }
        if allKey.contains("hov") {
            model.hov = ["hov" : attributeNodeParser2(jsonData["hov"] as! [String : Any])]
        }
        if allKey.contains("red") {
            model.red = ["red" : attributeNodeParser(jsonData["red"] as! [String : Any])]
        }
        return model
    }

    func spacingSubNodeParser(_ jsonData: [String: Any]) -> KMAliasLight_attribute {
        let allKey = jsonData.keys
        let model = KMAliasLight_attribute.init()
        if allKey.contains("element") {
            model.element = ["element" : numberNodeParser(jsonData["element"] as! [String : Any])]
        }
        if allKey.contains("module") {
            model.module = ["module" : numberNodeParser(jsonData["module"] as! [String : Any])]
        }
        return model
    }
    
    func attributeNodeParser(_ jsonData: [String: Any]) -> KMAliasLight_attribute {
        let allKey = jsonData.keys
        let model = KMAliasLight_attribute.init()
        if allKey.contains("bg") {
            model.bg = ["bg" : stateParser(jsonData["bg"] as! [String : Any])]
        }
        if allKey.contains("text") {
            model.text = ["text" : stateParser(jsonData["text"] as! [String : Any])]
        }
        if allKey.contains("border") {
            model.border = ["border" : stateParser(jsonData["border"] as! [String : Any])]
        }
        if allKey.contains("anti") {
            model.anti = ["anti" : stateParser(jsonData["anti"] as! [String : Any])]
        }
        if allKey.contains("accent") {
            model.accent = ["accent" : stateParser(jsonData["accent"] as! [String : Any])]
        }
        if allKey.contains("neutral") {
            model.neutral = ["neutral" : stateParser(jsonData["neutral"] as! [String : Any])]
        }
        if allKey.contains("brand") {
            model.brand = ["brand" : stateParser(jsonData["brand"] as! [String : Any])]
        }
        if allKey.contains("error") {
            model.error = ["error" : stateParser(jsonData["error"] as! [String : Any])]
        }
        if allKey.contains("mg") {
            model.mg = ["mg" : valueTypeParser(jsonData["mg"] as! [String : Any])]
        }
        if allKey.contains("fg") {
            model.fg = ["fg" : stateParser(jsonData["fg"] as! [String : Any])]
        }
        if allKey.contains("dark") {
            model.dark = ["dark" : stateParser(jsonData["dark"] as! [String : Any])]
        }
        if allKey.contains("state") {
            model.state = ["state" : stateParser(jsonData["state"] as! [String : Any])]
        }
        if allKey.contains("bg-text") {
            model.bg_text = ["bg-text" : stateParser(jsonData["bg-text"] as! [String : Any])]
        }
        if allKey.contains("track") {
            model.track = ["track" : stateParser(jsonData["track"] as! [String : Any])]
        }
        if allKey.contains("track-filled") {
            model.track_filled = ["track-filled" : stateParser(jsonData["track-filled"] as! [String : Any])]
        }
        if allKey.contains("knob") {
            model.knob = ["knob" : stateParser(jsonData["knob"] as! [String : Any])]
        }
        return model
    }
    
    func attributeNodeParser2(_ jsonData: [String: Any]) -> KMAliasLight_attribute {
        let allKey = jsonData.keys
        let model = KMAliasLight_attribute.init()
        if allKey.contains("bg") {
            model.bg = ["bg" : valueTypeParser(jsonData["bg"] as! [String : Any])]
        }
        if allKey.contains("footnote") {
            model.footnote = ["footnote" : valueTypeParser(jsonData["footnote"] as! [String : Any])]
        }
        return model
    }
    
    func stateParser(_ jsonData: [String: Any]) -> KMAliasLight_state {
        let allKey = jsonData.keys
        let model = KMAliasLight_state.init()
        if allKey.contains("norm") {
            model.norm = ["norm" : valueTypeParser(jsonData["norm"] as! [String : Any])]
        }
        if allKey.contains("hov") {
            model.hov = ["hov" : valueTypeParser(jsonData["hov"] as! [String : Any])]
        }
        if allKey.contains("act") {
            model.act = ["act" : valueTypeParser(jsonData["act"] as! [String : Any])]
        }
        if allKey.contains("dis") {
            model.dis = ["dis" : valueTypeParser(jsonData["dis"] as! [String : Any])]
        }
        if allKey.contains("def") {
            model.def = ["def" : valueTypeParser(jsonData["def"] as! [String : Any])]
        }
        if allKey.contains("lv1") {
            model.lv1 = ["lv1" : valueTypeParser(jsonData["lv1"] as! [String : Any])]
        }
        if allKey.contains("lv2") {
            model.lv2 = ["lv2" : valueTypeParser(jsonData["lv2"] as! [String : Any])]
        }
        if allKey.contains("lv3") {
            model.lv3 = ["lv3" : valueTypeParser(jsonData["lv3"] as! [String : Any])]
        }
        if allKey.contains("home") {
            model.home = ["home" : valueTypeParser(jsonData["home"] as! [String : Any])]
        }
        if allKey.contains("view") {
            model.view = ["view" : valueTypeParser(jsonData["view"] as! [String : Any])]
        }
        if allKey.contains("tabbar") {
            model.tabbar = ["tabbar" : valueTypeParser(jsonData["tabbar"] as! [String : Any])]
        }
        if allKey.contains("light") {
            model.light = ["light" : valueTypeParser(jsonData["light"] as! [String : Any])]
        }
        if allKey.contains("light-dis") {
            model.light_dis = ["light-dis" : valueTypeParser(jsonData["light-dis"] as! [String : Any])]
        }
        if allKey.contains("dark") {
            model.dark = ["dark" : valueTypeParser(jsonData["dark"] as! [String : Any])]
        }
        if allKey.contains("bg") {
            model.bg = ["bg" : valueTypeParser(jsonData["bg"] as! [String : Any])]
        }
        if allKey.contains("note") {
            model.note = ["note" : valueTypeParser(jsonData["note"] as! [String : Any])]
        }
        if allKey.contains("info") {
            model.info = ["info" : valueTypeParser(jsonData["info"] as! [String : Any])]
        }
        if allKey.contains("error") {
            model.error = ["error" : valueTypeParser(jsonData["error"] as! [String : Any])]
        }
        if allKey.contains("warning") {
            model.warning = ["warning" : valueTypeParser(jsonData["warning"] as! [String : Any])]
        }
        if allKey.contains("focus") {
            model.focus = ["focus" : valueTypeParser(jsonData["focus"] as! [String : Any])]
        }
        if allKey.contains("sel") {
            model.sel = ["sel" : valueTypeParser(jsonData["sel"] as! [String : Any])]
        }

        return model
    }
    
    func stateParser2(_ jsonData: [String: Any]) -> KMAliasLight_state {
        let allKey = jsonData.keys
        let model = KMAliasLight_state.init()
        if allKey.contains("norm") {
            model.norm = ["norm" : lvParser(jsonData["norm"] as! [String : Any])]
        }
        return model
    }
    
    func lvParser(_ jsonData: [String: Any]) -> KMAliasLight_lv {
        let allKey = jsonData.keys
        let model = KMAliasLight_lv.init()
        if allKey.contains("lv1") {
            model.lv1 = ["lv1" : valueTypeParser(jsonData["lv1"] as! [String : Any])]
        }
        if allKey.contains("lv2") {
            model.lv2 = ["lv2" : valueTypeParser(jsonData["lv2"] as! [String : Any])]
        }
        if allKey.contains("lv3") {
            model.lv3 = ["lv3" : valueTypeParser(jsonData["lv3"] as! [String : Any])]
        }
        return model
    }

    func numberNodeParser(_ jsonData: [String: Any]) -> KMAliasLight_number {
        let allKey = jsonData.keys
        let model = KMAliasLight_number.init()
        if allKey.contains("0") {
            model.number0 = ["0" : valueTypeParser(jsonData["0"] as! [String : Any])]
        }
        if allKey.contains("1") {
            model.number1 = ["1" : valueTypeParser(jsonData["1"] as! [String : Any])]
        }
        if allKey.contains("2") {
            model.number2 = ["2" : valueTypeParser(jsonData["2"] as! [String : Any])]
        }
        if allKey.contains("4") {
            model.number4 = ["4" : valueTypeParser(jsonData["4"] as! [String : Any])]
        }
        if allKey.contains("6") {
            model.number6 = ["6" : valueTypeParser(jsonData["6"] as! [String : Any])]
        }
        if allKey.contains("8") {
            model.number8 = ["8" : valueTypeParser(jsonData["8"] as! [String : Any])]
        }
        if allKey.contains("12") {
            model.number12 = ["12" : valueTypeParser(jsonData["12"] as! [String : Any])]
        }
        if allKey.contains("16") {
            model.number16 = ["16" : valueTypeParser(jsonData["16"] as! [String : Any])]
        }
        if allKey.contains("24") {
            model.number24 = ["24" : valueTypeParser(jsonData["24"] as! [String : Any])]
        }
        if allKey.contains("32") {
            model.number32 = ["32" : valueTypeParser(jsonData["32"] as! [String : Any])]
        }
        if allKey.contains("40") {
            model.number40 = ["40" : valueTypeParser(jsonData["40"] as! [String : Any])]
        }
        if allKey.contains("56") {
            model.number56 = ["56" : valueTypeParser(jsonData["56"] as! [String : Any])]
        }
        if allKey.contains("64") {
            model.number64 = ["64" : valueTypeParser(jsonData["64"] as! [String : Any])]
        }
        if allKey.contains("80") {
            model.number80 = ["80" : valueTypeParser(jsonData["80"] as! [String : Any])]
        }
        if allKey.contains("88") {
            model.number88 = ["88" : valueTypeParser(jsonData["88"] as! [String : Any])]
        }
        return model
    }
    
    func sizeParser(_ jsonData: [String: Any]) -> KMAliasLight_size {
        let allKey = jsonData.keys
        let model = KMAliasLight_size.init()
        if allKey.contains("s") {
            model.s = ["s" : valueTypeParser(jsonData["s"] as! [String : Any])]
        }
        if allKey.contains("m") {
            model.m = ["m" : valueTypeParser(jsonData["m"] as! [String : Any])]
        }
        if allKey.contains("l") {
            model.l = ["l" : valueTypeParser(jsonData["l"] as! [String : Any])]
        }
        if allKey.contains("xs") {
            model.xs = ["xs" : valueTypeParser(jsonData["xs"] as! [String : Any])]
        }
        if allKey.contains("m-base") {
            model.m_base = ["m-base" : valueTypeParser(jsonData["m-base"] as! [String : Any])]
        }
        if allKey.contains("xl") {
            model.xl = ["xl" : valueTypeParser(jsonData["xl"] as! [String : Any])]
        }
        return model
    }

    func valueTypeParser(_ jsonData: [String: Any]) -> KMAliasLight_valueType {
        let allKey = jsonData.keys
        let model = KMAliasLight_valueType.init()
        if allKey.contains("value") {
            model.value = ["value" : jsonData["value"] as! String]
        }
        if allKey.contains("type") {
            model.type = ["type" : jsonData["type"] as! String]
        }
        return model
    }
}

// MARK: - Parser Action

extension KMAliasLightParser {
    func startJSONParse() -> [String : Any] {
        self.fileName = "alias-light"
        self.fileType = "json"
        return self.jsonParser
    }
}