package com.ttstd.controlled.accessibility;

import android.accessibilityservice.AccessibilityService;
import android.accessibilityservice.AccessibilityServiceInfo;
import android.content.Context;
import android.os.Build;
import android.provider.Settings;
import android.util.Log;
import android.view.KeyEvent;
import android.view.accessibility.AccessibilityEvent;

/**
 * 键盘无障碍服务。
 * <p>
 * 用于在应用没有系统签名、也没有 root 权限时，通过无障碍能力模拟系统级全局按键。
 * 具体能力：
 * - {@link #pressKey(int)}：将部分 KeyEvent 按键码映射为 AccessibilityService 的全局动作
 *   （返回 / 主页 / 多任务 / 通知 / 音量等），通过 {@link #performGlobalAction(int)} 触发。
 * - {@link #dispatchGesture(GestureDescription, ...)}（继承自父类）：供
 *   {@code AccessibilityInputUtils} 模拟触摸/滑动/长按等手势。
 * <p>
 * 注意：无障碍服务无法直接模拟任意字符按键（如字母、数字），只能触发上述全局动作。
 */
public class KeyboardAccessibilityService extends AccessibilityService {

    private static final String TAG = "KeyboardA11yService";
    private static KeyboardAccessibilityService sInstance;

    /** 获取当前正在运行的实例（未启用时返回 null）。 */
    public static KeyboardAccessibilityService getInstance() {
        return sInstance;
    }

    /** 无障碍服务是否已经启用并运行。 */
    public static boolean isRunning() {
        return sInstance != null;
    }

    @Override
    protected void onServiceConnected() {
        super.onServiceConnected();
        sInstance = this;

        // 也可以通过 res/xml/accessibility_service_config.xml 配置，这里做一次兜底设置。
        AccessibilityServiceInfo info = new AccessibilityServiceInfo();
        info.eventTypes = AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED
                | AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED;
        info.feedbackType = AccessibilityServiceInfo.FEEDBACK_GENERIC;
        info.notificationTimeout = 100;
        setServiceInfo(info);

        Log.i(TAG, "Accessibility service connected");
    }

    @Override
    public void onAccessibilityEvent(AccessibilityEvent event) {
        // 本服务仅用于模拟输入，无需处理具体无障碍事件。
    }

    @Override
    public void onInterrupt() {
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        if (sInstance == this) {
            sInstance = null;
        }
        Log.i(TAG, "Accessibility service destroyed");
    }

    /**
     * 通过无障碍服务的全局动作模拟按键。
     * 仅支持系统级全局按键，对于无障碍无法直接模拟的按键码返回 false。
     *
     * @param keyCode Android {@link KeyEvent} 按键码
     * @return 是否成功模拟（true 表示已触发对应全局动作）
     */
    public boolean pressKey(int keyCode) {
        int globalAction = mapKeyToGlobalAction(keyCode);
        if (globalAction >= 0) {
            return performGlobalAction(globalAction);
        }
        Log.w(TAG, "Unsupported key code for accessibility: " + keyCode);
        return false;
    }

    private static int mapKeyToGlobalAction(int keyCode) {
        switch (keyCode) {
            case KeyEvent.KEYCODE_BACK:
                return GLOBAL_ACTION_BACK;
            case KeyEvent.KEYCODE_HOME:
                return GLOBAL_ACTION_HOME;
            case KeyEvent.KEYCODE_APP_SWITCH:
                return GLOBAL_ACTION_RECENTS;
            case KeyEvent.KEYCODE_NOTIFICATION:
                return GLOBAL_ACTION_NOTIFICATIONS;
            case KeyEvent.KEYCODE_VOLUME_UP:
                // GLOBAL_ACTION_VOLUME_UP = 11 (API 29)
                return Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q ? 11 : -1;
            case KeyEvent.KEYCODE_VOLUME_DOWN:
                // GLOBAL_ACTION_VOLUME_DOWN = 12 (API 29)
                return Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q ? 12 : -1;
            case KeyEvent.KEYCODE_VOLUME_MUTE:
                // GLOBAL_ACTION_VOLUME_MUTE = 13 (API 29)
                return Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q ? 13 : -1;
            default:
                return -1;
        }
    }
}
