package com.joyful.euphoria.board.utils

import com.joyful.euphoria.board.R
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.joyful.euphoria.board.EuphoriaBoard
import com.joyful.euphoria.board.assistant.ResponseConfigAssistant
import org.xmlpull.v1.XmlPullParser
import java.io.File
import java.io.StringReader
import kotlin.collections.iterator

class ThemesUtils(var context: Context) {


    private var textSize = 13f

    var functionDraw: Drawable =
        getDefaultDrawList(R.drawable.euphoria_default_normal_key, R.drawable.euphoria_default_pressed_key)
    var generalDraw: Drawable =
        getDefaultDrawList(R.drawable.euphoria_default_normal_key, R.drawable.euphoria_default_pressed_key)

    var toDraw: Drawable = getDefaultDrawList(R.drawable.euphoria_default_normal_key, R.drawable.euphoria_default_pressed_key)
    var spaceDraw: Drawable = getDefaultDrawList(R.drawable.euphoria_default_normal_key, R.drawable.euphoria_default_pressed_key)

    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 getConfig(): ResponseConfigAssistant? {
        val skinPath = SaveCurrentThemeUtils.getSkinPath()
        val configFilePath = skinPath + "assets/keyboard.conf"
        val file = File(configFilePath)
        return if (file.exists()) {
            DealConfUtils.initConfig(configFilePath)
        } else {
            null
        }
    }

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

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

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

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

        }
    }


    private fun getDefaultDrawList(normalDrawId: Int, pressDrawId: Int): StateListDrawable {
        val normalDraw = ContextCompat.getDrawable(EuphoriaBoard.Companion.euphoriaBoardInstance, normalDrawId)
        val pressDraw = ContextCompat.getDrawable(EuphoriaBoard.Companion.euphoriaBoardInstance, 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 == KeyNamesUtils.keyTextColorName
                    val b4 = attributeName == KeyNamesUtils.keyTextColorFunctionName
                    if (b3 || b4) {
                        resMaps[attributeName] = Color.parseColor(nextTextValue)
                    }
                }
                curType = xmlPullParser.next()
            }

        }

        callBack.invoke(resMaps)


    }


}