package com.qmai.android.keyboard;

import android.content.Context
import android.graphics.Canvas
import android.graphics.Color
import android.graphics.Paint
import android.inputmethodservice.Keyboard
import android.inputmethodservice.KeyboardView
import android.util.AttributeSet
import android.util.Log
import android.util.TypedValue
import android.widget.EditText
import com.qmai.android.keyboardview.R

class CommonKeyBoardKeyBoard : KeyboardView {
    private lateinit var keys: List<Keyboard.Key>
    private var editWidget: EditText? = null
    private lateinit var mtextPaint: Paint

    //默认值
    private var mSureDefaultColor = Color.parseColor("#ffffff")//文字的默认颜色
    private var mClearDefaultColor = Color.parseColor("#000000")//文字的默认颜色
    //最大的按钮 “确定”
    var btnText: String? = null
    var sureTextColor:Int? = null
    var sureTextSize:Float? = null
    //右上角的按钮 “清空”
    var rightTopBtn: String? = null
    var clearTextColor:Int? = null
    var clearTextSize:Float? = null


    //获取drawable资源
    val drawable = context.resources.getDrawable(R.drawable.savestock_blue)

    private var defaultActionListener: DefaultKeyBoardActionListener? =
        DefaultKeyBoardActionListener()

    enum class Code constructor(var code: Int) {
        DELETE(10), CLEAR(11), SAVE(-11)
    }


    constructor(context: Context?, attrs: AttributeSet?) : super(context, attrs) {
        init(context)
    }

    constructor(context: Context?, attrs: AttributeSet?, defStyleAttr: Int) : super(
        context,
        attrs,
        defStyleAttr
    ) {
        init(context)
        attrs?.let { retrieveAttributes(attrs) }
    }


    fun bindEditText(editText: EditText?) {
        editWidget = editText
        defaultActionListener?.et = editText
    }

    fun setKeyBoardLister(keyBoardListener: DefaultKeyBoardActionListener?) {
        defaultActionListener = keyBoardListener
        onKeyboardActionListener = defaultActionListener
    }

    override fun onDraw(canvas: Canvas?) {
        super.onDraw(canvas)
        if (!::keys.isInitialized) {
            keys = getKeyboard().keys
        }
        canvas?.let { c ->
            val keys: List<Keyboard.Key> = keyboard.keys
            keys.forEach { key ->
                if (key.codes[0] == -11) {
                    //把真正的状态设置给上层绘制的key键
                    drawable.state = key.currentDrawableState
                    //rawable将在被绘制在canvas的哪个矩形区域内（这个矩形区域的坐标是以canvas左上角为坐标原点的）
                    drawable.setBounds(
                        key.x,
                        key.y + paddingTop,
                        key.x + key.width + 2,
                        key.y + key.height + 4
                    )
                    //开始绘制
                    drawable.draw(canvas)
                    if (key.label != null) {
                        val fontMetrics = mtextPaint.fontMetrics
                        mtextPaint.color = sureTextColor?:mSureDefaultColor
                        mtextPaint.textSize = sp2px(sureTextSize?:15f)
                        //计算基线
                        val baseLine =
                            key.y + (key.height) / 2 - (fontMetrics.bottom - fontMetrics.top) / 2
                        //绘制文字
                        canvas.drawText(
                            btnText?:"确定",
                            (key.x + ((key.width) / 2)).toFloat(), baseLine, mtextPaint
                        )
                    }
                } else if (key.codes[0] == 11) {
                    //开始绘制
                    if (key.label != null) {
                        val fontMetrics = mtextPaint.fontMetrics
                        mtextPaint.color = clearTextColor?:mClearDefaultColor
                        mtextPaint.textSize = sp2px(clearTextSize?:15f)
                        mtextPaint.textAlign = Paint.Align.CENTER
                        mtextPaint.color = Color.parseColor("#333333")
                        //计算基线
                        val baseLine =
                            key.y + (key.height) / 2 - (fontMetrics.bottom - fontMetrics.top) / 2
                        //绘制文字
                        canvas.drawText(
                            rightTopBtn?:"清空",
                            (key.x + ((key.width) / 2)).toFloat(),
                            baseLine + key.height / 2,
                            mtextPaint
                        )
                    }
                }else if (key.codes[0]==20){
                    //开始绘制
                    if (key.label != null) {
                        val fontMetrics = mtextPaint.fontMetrics
                        mtextPaint.textSize = sp2px(15f)
                        mtextPaint.textAlign = Paint.Align.CENTER
                        mtextPaint.color = Color.parseColor("#333333")
                        //计算基线
                        val baseLine =
                            key.y + (key.height) / 2 - (fontMetrics.bottom - fontMetrics.top) / 2
                        //绘制文字
                        canvas.drawText(
                            "•",
                            (key.x + ((key.width) / 2)).toFloat(),
                            baseLine + key.height / 2,
                            mtextPaint
                        )
                    }
                }
            }
        }
    }


    open class DefaultKeyBoardActionListener : OnKeyboardActionListener {
        var et: EditText? = null

        override fun swipeRight() {

        }

        override fun onPress(primaryCode: Int) {

        }

        override fun onRelease(primaryCode: Int) {

        }

        override fun swipeLeft() {

        }

        override fun swipeUp() {

        }

        override fun swipeDown() {

        }

        override fun onKey(primaryCode: Int, keyCodes: IntArray?) {
            et ?: return
            val editable = et!!.editableText
            when (primaryCode) {
                Code.CLEAR.code -> {
                    editable.clear()
                }
                Code.DELETE.code -> {
                    if (editable.isNotEmpty()) {
                        editable.delete(editable.length - 1, editable.length)
                    }
                }
                20 -> {
                    editable.append(".")
                }
                Code.SAVE.code -> {

                }
                else -> {
                    editable.append(primaryCode.toString())
                }
            }


        }

        override fun onText(text: CharSequence?) {

        }

    }

    private fun init(context: Context?) {
        val keyBoard = Keyboard(context, R.xml.inputphonekeyboard)
        isEnabled = true
        isPreviewEnabled = false
        this.keyboard = keyBoard
        onKeyboardActionListener = defaultActionListener
        mtextPaint = Paint(Paint.ANTI_ALIAS_FLAG)
        mtextPaint.textAlign = Paint.Align.CENTER
        mtextPaint.textSize = sp2px(20f)
        mtextPaint.color = Color.parseColor("#333333")
        keys = getKeyboard().keys
    }

    private fun retrieveAttributes(attrs: AttributeSet) {
        val typedArray =
            context.obtainStyledAttributes(attrs, R.styleable.CommonKeyBoardKeyBoardStyleable)
        for (i in 0 until typedArray.indexCount) {
            when (typedArray.getIndex(i)) {
                R.styleable.CommonKeyBoardKeyBoardStyleable_sureText -> {
                    btnText =
                        typedArray.getString(R.styleable.CommonKeyBoardKeyBoardStyleable_sureText)
                }
                R.styleable.CommonKeyBoardKeyBoardStyleable_clearText -> {
                    rightTopBtn = typedArray.getString(R.styleable.CommonKeyBoardKeyBoardStyleable_clearText)
                }

                R.styleable.CommonKeyBoardKeyBoardStyleable_sureTextColor -> {
                    sureTextColor = typedArray.getColor(
                        R.styleable.CommonKeyBoardKeyBoardStyleable_sureTextColor,
                        mSureDefaultColor
                    )
                }
                R.styleable.CommonKeyBoardKeyBoardStyleable_clearTextColor -> {
                    clearTextColor = typedArray.getColor(
                        R.styleable.CommonKeyBoardKeyBoardStyleable_clearTextColor,
                        mClearDefaultColor
                    )
                }
                R.styleable.CommonKeyBoardKeyBoardStyleable_sureTextSize -> {
                    sureTextSize = typedArray.getDimension(
                        R.styleable.CommonKeyBoardKeyBoardStyleable_sureTextSize,15f)
                }
                R.styleable.CommonKeyBoardKeyBoardStyleable_clearTextSize -> {
                    clearTextSize = typedArray.getDimension(
                        R.styleable.CommonKeyBoardKeyBoardStyleable_clearTextSize,15f)
                }
//                R.styleable.CommonKeyBoardKeyBoardStyleable_pointColor->{
//                    pointColor = typedArray.getColor(R.styleable.CommonKeyBoardKeyBoardStyleable_pointColor,mClearDefaultColor)
//                }
//                R.styleable.CommonKeyBoardKeyBoardStyleable_pointSize->{
//                    pointSize = typedArray.getDimension(R.styleable.CommonKeyBoardKeyBoardStyleable_pointSize,15f)
//                }
            }
        }
        //销毁
        typedArray.recycle()
    }

    private fun sp2px(spValue: Float): Float {
        return TypedValue.applyDimension(
            TypedValue.COMPLEX_UNIT_SP,
            spValue,
            resources.displayMetrics
        )
    }

    override fun onDetachedFromWindow() {
        super.onDetachedFromWindow()

        Log.d("TAG", "onDetachedFromWindow: ")
    }
}