package com.rich.keyboard.skin.data

import android.content.Context
import android.graphics.BitmapFactory
import android.graphics.Color
import android.graphics.drawable.BitmapDrawable
import android.graphics.drawable.Drawable
import android.graphics.drawable.StateListDrawable
import android.util.Xml
import androidx.core.content.ContextCompat
import com.rich.keyboard.skin.MyApp
import com.rich.keyboard.skin.R
import com.rich.keyboard.skin.data.configbean.ServiceConfigParamer
import com.rich.keyboard.skin.utils.MyResName
import com.rich.keyboard.skin.utils.MyConfigTheme
import com.rich.keyboard.skin.utils.MyStore
import org.xmlpull.v1.XmlPullParser
import java.io.File
import java.io.StringReader

class Config(var context: Context) {


    private var textSize = 13f

    var functionDraw: Drawable =
        getDefaultDrawList(R.drawable.dekey_normal, R.drawable.dekey_presse)
    var generalDraw: Drawable =
        getDefaultDrawList(R.drawable.dekey_normal, R.drawable.dekey_presse)

    var toDraw: Drawable = getDefaultDrawList(R.drawable.dekey_normal, R.drawable.dekey_presse)
    var spaceDraw: Drawable = getDefaultDrawList(R.drawable.dekey_normal, R.drawable.dekey_presse)

    var switchDraw: Drawable? = null
    var deleteDraw: Drawable? = null
    var backDraw: Drawable? = null
    var searchDraw: Drawable? = null

    var shiftDraw: Drawable? = null
    var shiftLockDraw: Drawable? = null

    var keyTextColor: Int = ContextCompat.getColor(context, R.color.black)
    var keyTextColorFunction: Int = ContextCompat.getColor(context, R.color.black)


//
//    fun getKeyboard() = {
//        val skinPath = MyStore.getSkinPath()
//        val configFilePath = skinPath + "assets/keyboard.conf"
//        val file = File(configFilePath)
//        if(file.exists()){
//              KeyboardConfigParser.initConfig(configFilePath)
//        }else{
//              null
//        }
//    }

    fun getConfig(): ServiceConfigParamer? {
        val skinPath = MyStore.getSkinPath()
        val configFilePath = skinPath + "assets/keyboard.conf"
        val file = File(configFilePath)
        return if (file.exists()) {
            MyConfigTheme.initConfig(configFilePath)
        } else {
            null
        }
    }

    fun getConfigBg(name: String): Drawable? {
        MyStore.getSkinPath()?.let { resPath ->
            val pPath = "${resPath}res/drawable-xhdpi-v4/"

            return getDrawList(
                pPath + name,
                pPath + name
            )
        }
        return null
    }

    fun updateSkinConfig() {
        MyStore.getSkinPath()?.let { resPath ->
            val pPath = "${resPath}res/drawable-xhdpi-v4/"
            pPath.let {
                readColors(resPath) {
                    for ((name, value) in it) {
                        if (name == MyResName.keyTextColorName) {
                            keyTextColor = value
                        }
                        if (name == MyResName.keyTextColorFunctionName) {
                            keyTextColorFunction = value
                        }
                    }

                }
                functionDraw = getDrawList(
                    it + MyResName.functionNormalName,
                    it + MyResName.functionPressName
                )
                generalDraw = getDrawList(it + MyResName.normalName, it + MyResName.pressName)
                toDraw = getDrawList(it + MyResName.toNormalName, it + MyResName.toPressName)
                spaceDraw =
                    getDrawList(it + MyResName.spaceNormalName, it + MyResName.spacePressName)
                switchDraw =
                    getDrawList(it + MyResName.imeSwitchName, it + MyResName.imeSwitchName)
                deleteDraw = getDrawList(
                    it + MyResName.deleteNormalName,
                    it + MyResName.deletePressName
                )
                backDraw = getDrawList(it + MyResName.backName, it + MyResName.backName)
                searchDraw = getDrawList(it + MyResName.searchName, it + MyResName.searchName)
                shiftDraw = getDrawList(
                    it + MyResName.shiftNormalName,
                    it + MyResName.shiftNormalName
                )
                shiftLockDraw =
                    getDrawList(it + MyResName.shiftLockName, it + MyResName.shiftLockName)
            }

        }
    }


    private fun getDefaultDrawList(normalDrawId: Int, pressDrawId: Int): StateListDrawable {
        val normalDraw = ContextCompat.getDrawable(MyApp.myAppInstance, normalDrawId)
        val pressDraw = ContextCompat.getDrawable(MyApp.myAppInstance, pressDrawId)
        val stateListDrawable = StateListDrawable().apply {
            addState(
                intArrayOf(android.R.attr.state_pressed),
                pressDraw
            )
            addState(intArrayOf(), normalDraw)
        }

        return stateListDrawable


    }


    private fun getDrawList(normalPath: String, pressPath: String): StateListDrawable {
        val pressDraw = BitmapFactory.decodeFile(pressPath)
        val normalDraw = BitmapFactory.decodeFile(normalPath)
        val stateListDrawable = StateListDrawable().apply {
            addState(
                intArrayOf(android.R.attr.state_pressed),
                BitmapDrawable(context.resources, pressDraw)
            )
            addState(intArrayOf(), BitmapDrawable(context.resources, normalDraw))
        }

        return stateListDrawable


    }

    private fun readColors(resPath: String, callBack: (Map<String, Int>) -> Unit) {
        val resMaps = mutableMapOf<String, Int>()

        val pPath = "${resPath}res/colors.xml"
        val file = File(pPath)
        if (file.exists()) {
            val xmlPullParser = Xml.newPullParser().apply {
                setInput(StringReader(file.readText()))
                setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, false)

            }
            var curType = xmlPullParser.eventType
            while (curType != XmlPullParser.END_DOCUMENT) {
                val b = curType == XmlPullParser.START_TAG
                val b1 = xmlPullParser.name == "color"
                val b2 = xmlPullParser.name == "item"
                if (b && (b1 || b2)) {
                    val attributeName = xmlPullParser.getAttributeValue(null, "name")
                    val nextTextValue = xmlPullParser.nextText()
                    val b3 = attributeName == MyResName.keyTextColorName
                    val b4 = attributeName == MyResName.keyTextColorFunctionName
                    if (b3 || b4) {
                        resMaps[attributeName] = Color.parseColor(nextTextValue)
                    }
                }
                curType = xmlPullParser.next()
            }

        }

        callBack.invoke(resMaps)


    }


}