package com.key.vibekeyboard.Keyboard;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.drawable.Drawable;
import android.inputmethodservice.Keyboard;
import android.inputmethodservice.KeyboardView;
import android.util.AttributeSet;
import android.view.inputmethod.EditorInfo;


import com.key.vibekeyboard.Utils.Mytool;

import java.util.List;

public class MyKeyboard extends KeyboardView {
    // 自定义键盘视图类，继承自 KeyboardView，用于自定义键盘布局及其行为。

    private Paint mPaint;
    // 用于绘制键盘的 Paint 对象。

    private int viewType = 0;
    // 键盘视图的类型，用于区分不同的键盘视图模式。

    private int shiftType = 0;
    // 当前 Shift 键的状态，0 表示未按下，其他值可能表示按下或锁定状态。

    private CustomViewConfig config;
    // 键盘的自定义配置对象，包含键盘背景、键的颜色和图标等。

    private int curImeAction;
    // 当前输入法的动作类型（如搜索、完成等）。

    public MyKeyboard(Context context, AttributeSet attrs) {
        super(context, attrs);
        initView();
        // 初始化视图，配置画笔和其他参数。
    }

    public static class KeyBoard extends Keyboard {
        // 自定义键盘类，继承自 Keyboard，用于定义键盘的布局和键值。

        public static final int KEYCODE_SHIFT_MORE = -360;
        public static final int KEYCODE_SHIFT_123 = -361;
        // 自定义的键值常量，分别用于切换到更多符号和切换到 123 键盘。

        public KeyBoard(Context context, int layoutTemplateResId) {
            super(context, layoutTemplateResId);
            // 使用布局模板资源 ID 初始化键盘对象。
        }
    }

    public int getShiftType() {
        return shiftType;
        // 返回当前 Shift 键的状态。
    }

    public void setShiftType(int shiftType) {
        this.shiftType = shiftType;
        // 设置 Shift 键的状态。
    }

    public void setViewType(int viewType) {
        this.viewType = viewType;
        // 设置键盘视图的类型。
    }

    public int getViewType() {
        return viewType;
        // 返回当前键盘视图的类型。
    }

    @Override
    public void onDraw(Canvas canvas) {
        // 重写 onDraw 方法，自定义绘制键盘的方式。

        KeyBoard keyboard = (KeyBoard) getKeyboard();
        // 获取当前键盘对象。

        List<Keyboard.Key> keys = keyboard.getKeys();
        // 获取键盘中的所有键。

        for (int r = 0; r < keys.size(); r++) {
            Keyboard.Key key = keys.get(r);
            // 遍历每个键对象。

            int code = key.codes[0];
            // 获取键的第一个键值代码。

            mPaint.setColor(config.getKeyActioncolor());
            // 设置画笔的颜色为操作键的颜色。

            if (code == KeyBoard.KEYCODE_MODE_CHANGE) {
                // 如果键是模式切换键，绘制其背景和标签（无文字）。

                onDrawKeyBackground(key, config.getBgActionDraw(), canvas);
                onDrawLabel(key, canvas, "");

            } else if (code == KeyBoard.KEYCODE_SHIFT) {
                // 如果键是 Shift 键，绘制其背景和图标。

                onDrawKeyBackground(key, config.getBgActionDraw(), canvas);
                Mytool.onDrawKeyIcon(key, getShiftDraw(), canvas, this);

            } else if (code == KeyBoard.KEYCODE_SHIFT_123) {
                // 如果键是切换到 123 键盘的键，绘制其背景和标签（无文字）。

                onDrawKeyBackground(key, config.getBgActionDraw(), canvas);
                onDrawLabel(key, canvas, "");

            } else if (code == KeyBoard.KEYCODE_SHIFT_MORE) {
                // 如果键是切换到更多符号的键，绘制其背景和标签（无文字）。

                onDrawKeyBackground(key, config.getBgActionDraw(), canvas);
                onDrawLabel(key, canvas, "");

            } else if (code == KeyBoard.KEYCODE_DONE) {
                // 如果键是完成键，根据当前输入法的动作类型绘制其背景和标签。

                onDrawKeyBackground(key, config.getBgActionDraw(), canvas);
                if (curImeAction == EditorInfo.IME_ACTION_SEARCH) {
                    onDrawLabel(key, canvas, "Search");
                } else {
                    onDrawLabel(key, canvas, "");
                }

            } else if (code == KeyBoard.KEYCODE_DELETE) {
                // 如果键是删除键，绘制其背景、图标和标签（无文字）。

                onDrawKeyBackground(key, config.getBgActionDraw(), canvas);
                Mytool.onDrawKeyIcon(key, config.getIconDel(), canvas, this);
                onDrawLabel(key, canvas, "");

            } else {
                // 其他普通键，设置画笔颜色为普通键颜色，绘制其背景和标签。

                mPaint.setColor(config.getKeyNoramlcolor());
                onDrawKeyBackground(key, config.getBgNormalDraw(), canvas);
                onDrawLabel(key, canvas, "");
            }
        }
    }

    private Drawable getShiftDraw() {
        // 根据 Shift 键的状态返回相应的图标。

        if (shiftType == 0) {
            return config.getIconShift();
        } else {
            return config.getIconShiftLock();
        }
    }

    private void initView() {
        // 初始化视图，配置画笔和自定义视图配置对象。

        config = new CustomViewConfig();
        mPaint = new Paint();
        config.init();
        float texsize = Mytool.spToPpx(20f, this.getContext());
        mPaint.setTextSize(texsize);
        setPreviewEnabled(false);
        // 禁用键预览。
    }

    public void updateConfigView(Context con, int ime) {
        // 更新键盘配置视图，根据上下文和输入法动作类型更新配置。

        curImeAction = ime;
        config.updateConfig(con);
        setBackground(config.getBG());
        invalidateAllKeys();
        // 更新键盘背景并刷新所有按键。
    }

    private void onDrawKeyBackground(Keyboard.Key myKey, Drawable keyBG, Canvas canvas) {
        // 绘制按键的背景。

        if (keyBG != null) {
            int left = myKey.x + getPaddingLeft();
            int top = myKey.y + getPaddingTop();
            int right = left + myKey.width;
            int bottom = top + myKey.height;

            keyBG.setBounds(left, top, right, bottom);
            keyBG.setState(myKey.getCurrentDrawableState());
            keyBG.draw(canvas);
            // 设置背景的边界并绘制背景。
        }
    }

    private void onDrawLabel(Keyboard.Key myKey, Canvas canvas, String custLabel) {
        // 绘制按键的标签文字。

        boolean b = myKey.label == null || myKey.label == "";
        if (!b) {
            float y1 = myKey.y + myKey.height / 2f - (mPaint.descent() + mPaint.ascent()) / 2f;
            float x1 = myKey.x + getPaddingLeft() + (myKey.width / 2f);
            x1 -= mPaint.measureText(myKey.label.toString()) / 2f;
            // 计算标签的绘制位置，居中显示。

            if (!custLabel.isEmpty()) {
                // 如果提供了自定义标签，使用自定义标签绘制文字。

                float texsize = Mytool.spToPpx(14f, this.getContext());
                mPaint.setTextSize(texsize);
                canvas.drawText(custLabel, x1, y1, mPaint);
            } else {
                // 否则使用按键的默认标签绘制文字。

                float texsize = Mytool.spToPpx(18f, this.getContext());
                mPaint.setTextSize(texsize);
                canvas.drawText(myKey.label.toString(), x1, y1, mPaint);
            }
        }
    }
}

