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

import Cocoa

class KMBaseParser: NSObject {
    
    var fileName: String = "comp-light"
    var fileType: String = "json"
    var jsonParser: [String: Any] {
        let data = try? Data(contentsOf: URL(fileURLWithPath: Bundle.main.path(forResource: fileName, ofType: fileType)!))
        let jsonData = try! JSONSerialization.jsonObject(with: data!, options: JSONSerialization.ReadingOptions.mutableContainers)
        return jsonData as! [String: Any]
    }
    var globalDict: [String : Any] = [:]
    var aliasLightDict: [String : Any] = [:]
    
    var finalDict: [String : Any] = [:]

    // MARK: Parser Action
    
    func valueParser(key : String) -> Any {
        var parserKey = key
        if key.first == "{" {
            parserKey.removeFirst(1)
        }
        if key.last == "}" {
            parserKey.removeLast(1)
        }
        let keys = parserKey.split(separator: ".")
        var parserArr: [[String : Any]] = [aliasLightDict, globalDict]
        for subKey in keys {
            if subKey == keys.last {
                if parserArr.count == 1 {
                    let dict: [String : Any] = parserArr.last!
                    let valueDict = dict[String(subKey)] as! [String : Any]
                    let value = valueDict["value"]
                    if value is [String : Any] {
                        return value as Any
                    } else if value is String {
                        let valueStr = value as! String
                        if (valueStr.first == "{") && (valueStr.last == "}") {
                            return valueParser(key: valueStr)
                        } else if (valueStr.first == "r" && valueStr.last == ")") {
                            return rgbaParser(key: valueStr)
                        } else {
                            return valueStr
                        }
                    }
                } else if parserArr.count == 2 {
                    for model in parserArr {
                        let allKey = model.keys
                        if allKey.contains(String(subKey)) {
                            let valueDict = model[String(subKey)] as! [String : Any]
                            let allKey = valueDict.keys
                            if allKey.contains("value") {
                                let value = valueDict["value"]
                                if value is [String : Any] {
                                    return value as Any
                                } else if value is String {
                                    let valueStr = value as! String
                                    if (valueStr.first == "{") && (valueStr.last == "}") {
                                        return valueParser(key: valueStr)
                                    } else if (valueStr.first == "r" && valueStr.last == ")") {
                                        return rgbaParser(key: valueStr)
                                    } else {
                                        return valueStr
                                    }
                                }
                            }
                        }
                    }
                }
            } else {
                parserArr = parserAction(parserArr, String(subKey))
            }
        }
        return ""

    }
        
    func rgbaParser(key : String) -> Any {
        var parserKey = key
        if key.first == "r" {
            parserKey.removeFirst(5)
        }
        if key.last == ")" {
            parserKey.removeLast(1)
        }
        let parserKey1 = parserKey.replacingOccurrences(of: " ", with: "") as String
        let keys = parserKey1.split(separator: ",")
        return String(format: "%@,%@", valueParser(key: String(keys[0])) as! String, String(keys[1]))
    }
    
    func parserAction(_ array: [[String : Any]], _ key: String) -> [[String : Any]] {
        var parserArr: [[String : Any]] = []
        for model in array {
            let allKey = model.keys
            if allKey.contains(key) {
                parserArr.append(model[key] as! [String : Any])
            }
        }
        return parserArr
    }
}