package com.key.vibekeyboard.Keyboard;

import android.content.Context;
import android.inputmethodservice.InputMethodService;
import android.inputmethodservice.KeyboardView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.inputmethod.EditorInfo;
import android.view.inputmethod.InputMethodManager;

import com.key.vibekeyboard.R;


public class KeyboardService extends InputMethodService implements KeyboardView.OnKeyboardActionListener {
    private int[] ViewXmls = new int[4];  // 保存不同键盘视图的XML资源ID
    private MyKeyboard myKeyboard;  // 自定义键盘视图的实例

    private int curImeAction;  // 当前输入法的动作类型

    public KeyboardService() {
        // 默认构造函数
    }

    // 创建输入视图的方法，返回键盘视图
    @Override
    public View onCreateInputView() {
        // 初始化不同键盘视图的XML布局文件
        ViewXmls[0] = R.xml.view_1;
        ViewXmls[1] = R.xml.view_2;
        ViewXmls[2] = R.xml.view_3;
        ViewXmls[3] = R.xml.view_4;

        // 加载主键盘视图布局文件
        View inputView = LayoutInflater.from(this).inflate(R.layout.keyboard_view, null, false);
        myKeyboard = inputView.findViewById(R.id.keyboardView);  // 绑定键盘视图

        setBackground();

        myKeyboard.setKeyboard(new MyKeyboard.KeyBoard(this, ViewXmls[0]));  // 设置默认键盘布局
        myKeyboard.setOnKeyboardActionListener(this);  // 设置键盘操作监听器
//        myKeyboard.setPreviewEnabled(false);  // 可选项，禁用按键预览
        return inputView;
    }

    // 当输入法窗口显示时调用
    @Override
    public void onWindowShown() {
        super.onWindowShown();
        setBackground();
    }

    private void setBackground(){
        curImeAction = getImeAction(getCurrentInputEditorInfo().imeOptions);  // 获取当前的输入法动作类型
        myKeyboard.updateConfigView(this, curImeAction);  // 更新键盘配置视图
        myKeyboard.invalidate();  // 刷新键盘视图
    }

    // 获取当前输入法的动作类型
    public int getImeAction(int imeOptions) {
        int i = imeOptions & EditorInfo.IME_MASK_ACTION;
        return i;
    }

    // 键盘按键被按下时调用
    @Override
    public void onKey(int primaryCode, int[] keyCodes) {
        switch (primaryCode) {
            case MyKeyboard.KeyBoard.KEYCODE_SHIFT:
                // 切换到大写字母布局或恢复到小写字母布局
                if (myKeyboard.getShiftType() == 0) {
                    changeView(3);
                    myKeyboard.setShiftType(1);
                } else {
                    changeView(0);
                    myKeyboard.setShiftType(0);
                }
                break;
            case MyKeyboard.KeyBoard.KEYCODE_MODE_CHANGE:
                // 切换到符号键盘或字母键盘
                if (myKeyboard.getViewType() == 0) {
                    changeView(1);
                } else {
                    changeView(0);
                }
                break;
            case MyKeyboard.KeyBoard.KEYCODE_SHIFT_123:
                // 切换到符号键盘
                changeView(1);
                break;
            case MyKeyboard.KeyBoard.KEYCODE_SHIFT_MORE:
                // 切换到更多符号键盘
                changeView(2);
                break;
            case MyKeyboard.KeyBoard.KEYCODE_DELETE:
                // 删除前一个字符
                getCurrentInputConnection().deleteSurroundingText(1, 0);
                break;
            case MyKeyboard.KeyBoard.KEYCODE_DONE:
                // 完成输入并隐藏键盘
                getCurrentInputConnection().performEditorAction(curImeAction);
                InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
                imm.hideSoftInputFromWindow(myKeyboard.getWindowToken(), 0);
                break;
            default:
                // 处理普通字符输入
                char value;
                if (myKeyboard.getShiftType() == 1) {
                    value = Character.toUpperCase((char) primaryCode);  // 大写字母
                } else {
                    value = (char) primaryCode;  // 小写字母
                }
                getCurrentInputConnection().commitText(String.valueOf(value), 1);  // 提交字符到输入连接
        }
    }

    // 更换键盘视图的方法
    private void changeView(int i) {
        myKeyboard.setViewType(i);  // 设置键盘视图类型
        myKeyboard.setShiftType(i);  // 设置键盘大小写类型
        myKeyboard.setKeyboard(new MyKeyboard.KeyBoard(this, ViewXmls[i]));  // 设置新的键盘布局
    }

    // 键被按下时调用
    @Override
    public void onPress(int primaryCode) {

    }

    // 键被释放时调用
    @Override
    public void onRelease(int primaryCode) {

    }


    @Override
    public void onText(CharSequence text) {
        // 文本输入时调用（未实现）
    }

    @Override
    public void swipeLeft() {
        // 左滑时调用（未实现）
    }

    @Override
    public void swipeRight() {
        // 右滑时调用（未实现）
    }

    @Override
    public void swipeDown() {
        // 下滑时调用（未实现）
    }

    @Override
    public void swipeUp() {
        // 上滑时调用（未实现）
    }
}
