package com.xyzshell.andinfo.libs

import android.content.Context
import android.content.pm.PackageManager
import android.hardware.input.InputManager
import android.os.Build
import android.view.InputDevice
import android.view.KeyCharacterMap
import androidx.annotation.RequiresApi

/**
 * 输入设备信息工具类
 * 提供所有输入设备（键盘、鼠标、触摸屏、游戏手柄等）的详细信息
 */
class InputInfo(private val context: Context) {

    /**
     * 输入管理器
     */
    private val inputManager = context.getSystemService(InputManager::class.java)

    /**
     * 获取所有输入设备列表
     * @return 输入设备信息列表
     */
    fun getInputDevices(): List<InputDeviceInfo> {
        return inputManager.inputDeviceIds.toList().mapNotNull { id ->
            inputManager.getInputDevice(id)?.let { device -> InputDeviceInfo(device) }
        }
    }

    /**
     * 根据设备ID获取指定的输入设备信息
     * @param deviceId 设备ID
     * @return 输入设备信息，如果设备不存在则返回null
     */
    fun getInputDevice(deviceId: Int): InputDeviceInfo? {
        return inputManager.getInputDevice(deviceId)?.let { device ->
            InputDeviceInfo(device)
        }
    }

    /**
     * 获取触摸的最大遮挡不透明度
     * Android 12+ 可用
     * 用于安全性，防止恶意应用遮挡触摸事件
     * @return 最大不透明度值 (0.0-1.0)
     */
    @RequiresApi(Build.VERSION_CODES.S)
    fun getMaximumObscuringOpacityForTouch(): Float {
        return inputManager.maximumObscuringOpacityForTouch
    }

    /**
     * 检查是否启用了触控笔指针图标
     * Android 14+ 可用
     * @return 是否启用触控笔指针图标
     */
    @RequiresApi(Build.VERSION_CODES.UPSIDE_DOWN_CAKE)
    fun isStylusPointerIconEnabled(): Boolean {
        return inputManager.isStylusPointerIconEnabled
    }

    // ==================== 硬件特性检测 ====================

    /**
     * 检查设备是否支持 USB Host 模式
     * USB Host 模式允许 Android 设备作为主机连接其他 USB 设备
     * @return 是否支持 USB Host
     */
    fun hasUsbHostSupport(): Boolean {
        return context.packageManager.hasSystemFeature(PackageManager.FEATURE_USB_HOST)
    }

    /**
     * 检查设备是否支持 USB 配件模式
     * USB 配件模式允许 Android 设备作为 USB 配件连接到其他设备
     * @return 是否支持 USB 配件模式
     */
    fun hasUsbAccessorySupport(): Boolean {
        return context.packageManager.hasSystemFeature(PackageManager.FEATURE_USB_ACCESSORY)
    }

    /**
     * 检查设备是否有指纹识别器
     * @return 是否有指纹识别器
     */
    fun hasFingerprintSensor(): Boolean {
        return context.packageManager.hasSystemFeature(PackageManager.FEATURE_FINGERPRINT)
    }

    /**
     * 检查设备是否有红外线传感器（IR Blaster）
     * 红外线传感器可用于遥控电视、空调等设备
     * @return 是否有红外线传感器
     */
    fun hasInfraredSensor(): Boolean {
        return context.packageManager.hasSystemFeature(PackageManager.FEATURE_CONSUMER_IR)
    }

    /**
     * 检查设备是否支持 UWB（Ultra-Wideband 超宽带）
     * UWB 用于精确定位和设备间通信
     * Android 12+ 可用
     * @return 是否支持 UWB
     */
    fun hasUwbSupport(): Boolean {
        return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
            context.packageManager.hasSystemFeature(PackageManager.FEATURE_UWB)
        } else {
            false
        }
    }

    /**
     * 检查设备是否支持 NFC（Near Field Communication 近场通信）
     * @return 是否支持 NFC
     */
    fun hasNfcSupport(): Boolean {
        return context.packageManager.hasSystemFeature(PackageManager.FEATURE_NFC)
    }

    /**
     * 检查设备是否支持 NFC HCE（Host Card Emulation 主机卡模拟）
     * HCE 允许应用模拟 NFC 卡片
     * @return 是否支持 NFC HCE
     */
    fun hasNfcHostCardEmulation(): Boolean {
        return context.packageManager.hasSystemFeature(PackageManager.FEATURE_NFC_HOST_CARD_EMULATION)
    }

    /**
     * 检查设备是否支持 NFC 离线主机卡模拟
     * 允许在设备离线时进行 NFC 交易
     * @return 是否支持离线 HCE
     */
    fun hasNfcHostCardEmulationOffHost(): Boolean {
        return context.packageManager.hasSystemFeature(PackageManager.FEATURE_NFC_HOST_CARD_EMULATION_NFCF)
    }

    /**
     * 检查设备是否支持安全 NFC（NFC with Secure Element）
     * 使用安全元素进行 NFC 交易，更安全
     * @return 是否支持安全 NFC
     */
    fun hasSecureNfcSupport(): Boolean {
        // 检查是否有安全元素相关的 NFC 功能
        return context.packageManager.hasSystemFeature("android.hardware.nfc.ese") ||
               context.packageManager.hasSystemFeature("android.hardware.nfc.uicc")
    }

    /**
     * 检查设备是否支持 GPS 定位
     * @return 是否支持 GPS
     */
    fun hasGpsSupport(): Boolean {
        return context.packageManager.hasSystemFeature(PackageManager.FEATURE_LOCATION_GPS)
    }

    /**
     * 检查设备是否支持网络定位
     * @return 是否支持网络定位
     */
    fun hasNetworkLocationSupport(): Boolean {
        return context.packageManager.hasSystemFeature(PackageManager.FEATURE_LOCATION_NETWORK)
    }

    /**
     * 检查设备是否支持任何定位服务
     * @return 是否支持定位
     */
    fun hasLocationSupport(): Boolean {
        return context.packageManager.hasSystemFeature(PackageManager.FEATURE_LOCATION)
    }

    /**
     * 获取所有硬件特性支持信息
     * @return 硬件特性支持信息数据类
     */
    fun getHardwareFeatures(): HardwareFeatures {
        return HardwareFeatures(
            usbHost = hasUsbHostSupport(),
            usbAccessory = hasUsbAccessorySupport(),
            fingerprint = hasFingerprintSensor(),
            infrared = hasInfraredSensor(),
            uwb = hasUwbSupport(),
            nfc = hasNfcSupport(),
            nfcHce = hasNfcHostCardEmulation(),
            nfcHceOffHost = hasNfcHostCardEmulationOffHost(),
            secureNfc = hasSecureNfcSupport(),
            gps = hasGpsSupport(),
            networkLocation = hasNetworkLocationSupport(),
            location = hasLocationSupport()
        )
    }

    /**
     * 硬件特性支持信息数据类
     */
    data class HardwareFeatures(
        val usbHost: Boolean,              // USB Host 支持
        val usbAccessory: Boolean,         // USB 配件支持
        val fingerprint: Boolean,          // 指纹识别器
        val infrared: Boolean,             // 红外线传感器
        val uwb: Boolean,                  // UWB 支持
        val nfc: Boolean,                  // NFC 支持
        val nfcHce: Boolean,               // NFC 主机卡模拟
        val nfcHceOffHost: Boolean,        // NFC 离线主机卡模拟
        val secureNfc: Boolean,            // 安全 NFC
        val gps: Boolean,                  // GPS 支持
        val networkLocation: Boolean,      // 网络定位支持
        val location: Boolean              // 任何定位支持
    )

    /**
     * 输入设备详细信息数据类
     * 包含设备的所有属性和功能
     */
    data class InputDeviceInfo(val inputDevice: InputDevice) {

        /**
         * 设备ID
         * 唯一标识一个输入设备
         */
        val id: Int get() = inputDevice.id

        /**
         * 控制器编号
         * 对于游戏手柄，表示第几个手柄（1-4）
         */
        val controllerNumber: Int get() = inputDevice.controllerNumber

        /**
         * 供应商ID
         * USB设备的供应商标识
         */
        val vendorId: Int get() = inputDevice.vendorId

        /**
         * 产品ID
         * USB设备的产品标识
         */
        val productId: Int get() = inputDevice.productId

        /**
         * 设备描述符
         * 设备的唯一描述字符串
         */
        val descriptor: String? get() = inputDevice.descriptor

        /**
         * 是否为虚拟设备
         * 虚拟设备如软键盘、注入的输入事件等
         */
        val isVirtual: Boolean get() = inputDevice.isVirtual

        /**
         * 是否为外部设备
         * Android 10+ 可用
         * 外部设备如USB键盘、蓝牙鼠标等
         */
        val isExternal: Boolean
            get() = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
                inputDevice.isExternal
            } else {
                false
            }

        /**
         * 设备名称
         * 示例: "Virtual Keyboard", "USB Mouse", "Bluetooth Gamepad"
         */
        val name: String get() = inputDevice.name

        /**
         * 输入源类型标志位
         * 表示设备支持的输入类型（键盘、鼠标、触摸屏等）
         */
        val sources: Int get() = inputDevice.sources

        /**
         * 键盘类型
         * KEYBOARD_TYPE_NONE - 无键盘
         * KEYBOARD_TYPE_NON_ALPHABETIC - 非字母键盘（如数字键盘）
         * KEYBOARD_TYPE_ALPHABETIC - 字母键盘
         */
        val keyboardType: Int get() = inputDevice.keyboardType

        /**
         * 键盘字符映射类型
         * 表示键盘的字符映射能力
         */
        val keyCharacterMapKeyboardType: Int get() = inputDevice.keyCharacterMap.keyboardType

        /**
         * 运动范围数量
         * 表示设备支持的轴数量（如游戏手柄的摇杆、扳机键等）
         */
        val motionRangesCount: Int get() = inputDevice.motionRanges.size

        /**
         * 是否有震动功能
         * Android 12+ 使用 vibratorManager，之前版本使用 vibrator
         */
        val hasVibrator: Boolean
            get() = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
                inputDevice.vibratorManager.vibratorIds.isNotEmpty()
            } else {
                @Suppress("DEPRECATION")
                inputDevice.vibrator.hasVibrator()
            }

        /**
         * 设备是否已启用
         * Android 8.1+ 可用
         * 禁用的设备不会产生输入事件
         */
        val isEnabled: Boolean
            get() = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O_MR1) {
                inputDevice.isEnabled
            } else {
                true
            }

        /**
         * 是否有麦克风
         * 某些输入设备（如游戏手柄）可能内置麦克风
         */
        val hasMicrophone: Boolean get() = inputDevice.hasMicrophone()

        companion object {
            /**
             * 键盘类型映射表（英文）
             */
            val keyboardTypeToString = mapOf(
                InputDevice.KEYBOARD_TYPE_NONE to "None",
                InputDevice.KEYBOARD_TYPE_NON_ALPHABETIC to "Non-alphabetic",
                InputDevice.KEYBOARD_TYPE_ALPHABETIC to "Alphabetic",
            )

            /**
             * 键盘类型映射表（中文）
             */
            val keyboardTypeToStringChinese = mapOf(
                InputDevice.KEYBOARD_TYPE_NONE to "无键盘",
                InputDevice.KEYBOARD_TYPE_NON_ALPHABETIC to "非字母键盘",
                InputDevice.KEYBOARD_TYPE_ALPHABETIC to "字母键盘",
            )

            /**
             * 键盘字符映射类型映射表（英文）
             */
            val keyCharacterMapKeyboardTypeToString = mapOf(
                KeyCharacterMap.NUMERIC to "Numeric",
                KeyCharacterMap.PREDICTIVE to "Predictive",
                KeyCharacterMap.ALPHA to "Alpha",
                KeyCharacterMap.FULL to "Full",
                KeyCharacterMap.SPECIAL_FUNCTION to "Special Function",
            )

            /**
             * 键盘字符映射类型映射表（中文）
             */
            val keyCharacterMapKeyboardTypeToStringChinese = mapOf(
                KeyCharacterMap.NUMERIC to "数字键盘",
                KeyCharacterMap.PREDICTIVE to "预测输入",
                KeyCharacterMap.ALPHA to "字母键盘",
                KeyCharacterMap.FULL to "完整键盘",
                KeyCharacterMap.SPECIAL_FUNCTION to "特殊功能键盘",
            )

            /**
             * 输入源类别映射表（英文）
             */
            val sourceClassToString = mapOf(
                InputDevice.SOURCE_CLASS_BUTTON to "Button",
                InputDevice.SOURCE_CLASS_POINTER to "Pointer",
                InputDevice.SOURCE_CLASS_TRACKBALL to "Trackball",
                InputDevice.SOURCE_CLASS_POSITION to "Position",
                InputDevice.SOURCE_CLASS_JOYSTICK to "Joystick",
            )

            /**
             * 输入源类别映射表（中文）
             */
            val sourceClassToStringChinese = mapOf(
                InputDevice.SOURCE_CLASS_BUTTON to "按钮",
                InputDevice.SOURCE_CLASS_POINTER to "指针",
                InputDevice.SOURCE_CLASS_TRACKBALL to "轨迹球",
                InputDevice.SOURCE_CLASS_POSITION to "位置",
                InputDevice.SOURCE_CLASS_JOYSTICK to "游戏杆",
            )

            /**
             * 输入源类型映射表（英文）
             */
            val sourceToString = mapOf(
                InputDevice.SOURCE_KEYBOARD to "Keyboard",
                InputDevice.SOURCE_DPAD to "D-Pad",
                InputDevice.SOURCE_GAMEPAD to "Gamepad",
                InputDevice.SOURCE_TOUCHSCREEN to "Touchscreen",
                InputDevice.SOURCE_MOUSE to "Mouse",
                InputDevice.SOURCE_STYLUS to "Stylus",
                InputDevice.SOURCE_TRACKBALL to "Trackball",
                InputDevice.SOURCE_TOUCHPAD to "Touchpad",
                InputDevice.SOURCE_TOUCH_NAVIGATION to "Touch Navigation",
                InputDevice.SOURCE_ROTARY_ENCODER to "Rotary Encoder",
                InputDevice.SOURCE_JOYSTICK to "Joystick",
                InputDevice.SOURCE_HDMI to "HDMI",
            )

            /**
             * 输入源类型映射表（中文）
             */
            val sourceToStringChinese = mapOf(
                InputDevice.SOURCE_KEYBOARD to "键盘",
                InputDevice.SOURCE_DPAD to "方向键",
                InputDevice.SOURCE_GAMEPAD to "游戏手柄",
                InputDevice.SOURCE_TOUCHSCREEN to "触摸屏",
                InputDevice.SOURCE_MOUSE to "鼠标",
                InputDevice.SOURCE_STYLUS to "触控笔",
                InputDevice.SOURCE_TRACKBALL to "轨迹球",
                InputDevice.SOURCE_TOUCHPAD to "触控板",
                InputDevice.SOURCE_TOUCH_NAVIGATION to "触摸导航",
                InputDevice.SOURCE_ROTARY_ENCODER to "旋转编码器",
                InputDevice.SOURCE_JOYSTICK to "游戏杆",
                InputDevice.SOURCE_HDMI to "HDMI",
            )
        }
    }
}
