package com.hikoncont.service.modules

import android.content.Context
import android.os.Handler
import android.os.Looper
import android.util.Log
import com.hikoncont.service.AccessibilityRemoteService
import com.hikoncont.service.modules.mask.InputBlockManager

/**
 * 遮罩覆盖层管理器 - 重构版
 * 使用AccessibilityService方案替代悬浮窗，无需额外权限
 * 
 * 主要功能:
 * - 输入阻塞控制
 * - 遮罩显示和控制
 * - 遮罩文本配置
 * - Web操作期间的遮罩控制
 */
class MaskOverlayManager(
    private val service: AccessibilityRemoteService,
    private val context: Context
) {
    companion object {
        private const val TAG = "MaskOverlayManager"
    }
    
    // 输入阻塞管理器
    private var inputBlockManager: InputBlockManager? = null
    
    // 主线程Handler
    private val mainHandler = Handler(Looper.getMainLooper())
    
    /**
     * 初始化遮罩管理器
     */
    fun initialize() {
        Log.i(TAG, "✅ 遮罩覆盖层管理器初始化")
        
        // 创建并初始化输入阻塞管理器
        inputBlockManager = InputBlockManager(context)
        inputBlockManager?.initialize()
        
        Log.i(TAG, "✅ 遮罩覆盖层管理器初始化完成")
    }
    
    /**
     * 阻止设备用户输入
     */
    fun blockInput() {
        try {
            setAllowAccessibilityOperations(true)
            Log.i(TAG, "🚫 开始阻止设备用户输入")
            inputBlockManager?.blockInput()
            Log.i(TAG, "✅ 设备用户输入阻止请求已发送")
        } catch (e: Exception) {
            Log.e(TAG, "❌ 阻止设备用户输入失败", e)
        }
    }
    
    /**
     * 允许设备用户输入
     */
    fun unblockInput() {
        try {
            Log.d(TAG, "🔓 恢复设备用户输入")
            inputBlockManager?.unblockInput()
            Log.i(TAG, "✅ 设备用户输入恢复请求已发送")
        } catch (e: Exception) {
            Log.e(TAG, "❌ 恢复设备用户输入失败", e)
        }
    }
    
    /**
     * 检查输入是否被阻塞
     */
    fun isInputBlocked(): Boolean {
        return try {
            inputBlockManager?.isInputBlocked() ?: false
        } catch (e: Exception) {
            Log.e(TAG, "❌ 检查输入阻塞状态失败", e)
            false
        }
    }
    
    /**
     * 设置遮罩文字配置
     */
    fun setMaskTextConfig(text: String?, textSize: Float?) {
        try {
            inputBlockManager?.setBlockTextConfig(text, textSize)
            Log.d(TAG, "📝 遮罩文字配置已更新")
        } catch (e: Exception) {
            Log.e(TAG, "❌ 设置遮罩文字配置失败", e)
        }
    }
    
    /**
     * 设置是否允许AccessibilityService操作
     * @param allow true=允许Web端操作(只显示遮罩), false=完全阻塞所有操作
     */
    fun setAllowAccessibilityOperations(allow: Boolean) {
        try {
            inputBlockManager?.setAllowAccessibilityOperations(allow)
            Log.d(TAG, "🔧 AccessibilityService操作权限已设置为: $allow")
        } catch (e: Exception) {
            Log.e(TAG, "❌ 设置AccessibilityService操作权限失败", e)
        }
    }
    
    /**
     * 设置Web操作后的恢复延迟时间
     * @param delayMs 延迟时间(毫秒)，建议值：
     *                - 点击操作：800-1000ms
     *                - 滑动操作：1200-1500ms
     *                - 复杂操作：2000ms+
     */
    fun setOperationDelay(delayMs: Long) {
        try {
            inputBlockManager?.setOperationDelay(delayMs)
            Log.d(TAG, "⏱️ Web操作恢复延迟已设置为: ${delayMs}ms")
        } catch (e: Exception) {
            Log.e(TAG, "❌ 设置操作延迟失败", e)
        }
    }
    
    /**
     * 启用非阻塞模式并显示遮罩
     * 便捷方法：Web端可以在遮罩显示时正常操作
     */
    fun enableNonBlockingMode() {
        try {
            Log.i(TAG, "🚀 启用非阻塞模式")
            setAllowAccessibilityOperations(true)
            blockInput()
            Log.i(TAG, "✅ 非阻塞模式已启用，Web端可以在遮罩下正常操作")
        } catch (e: Exception) {
            Log.e(TAG, "❌ 启用非阻塞模式失败", e)
        }
    }

    /**
     * 启用纯色遮罩模式（无文字）
     * 专用于黑屏遮盖功能：显示纯色遮罩，Web端可正常操作
     */
    fun enableBlackScreenMode() {
        try {
            Log.i(TAG, "🖤 启用纯色遮罩模式")
            setAllowAccessibilityOperations(true)
            inputBlockManager?.blockInputWithoutText() ?: run {
                Log.w(TAG, "⚠️ InputBlockManager不支持无文字遮罩，使用普通遮罩")
                blockInput()
            }
            Log.i(TAG, "✅ 纯色遮罩模式已启用，Web端可以在遮罩下正常操作")
        } catch (e: Exception) {
            Log.e(TAG, "❌ 启用纯色遮罩模式失败", e)
        }
    }
    
    /**
     * 启用完全阻塞模式并显示遮罩
     * 传统模式：需要临时移除遮罩才能执行Web操作
     */
    fun enableFullBlockingMode() {
        try {
            Log.i(TAG, "🔒 启用完全阻塞模式")
            setAllowAccessibilityOperations(false)
            blockInput()
            Log.i(TAG, "✅ 完全阻塞模式已启用，Web操作需要临时移除遮罩")
        } catch (e: Exception) {
            Log.e(TAG, "❌ 启用完全阻塞模式失败", e)
        }
    }
    
    /**
     * 临时移除遮罩（用于Web操作期间）
     * 🔑 智能阻塞模式：不再需要临时移除，AccessibilityService可以直接穿透
     */
    fun temporarilyRemoveMask() {
        try {
            Log.d(TAG, "⏰ 智能阻塞模式：无需临时移除遮罩，AccessibilityService可以直接操作")
        } catch (e: Exception) {
            Log.e(TAG, "❌ 临时移除遮罩失败", e)
        }
    }
    
    /**
     * 恢复遮罩（Web操作完成后）
     * 🔑 智能阻塞模式：不再需要恢复，遮罩始终保持显示
     */
    fun restoreMask() {
        try {
            Log.d(TAG, "🔄 智能阻塞模式：无需恢复遮罩，遮罩始终保持显示")
        } catch (e: Exception) {
            Log.e(TAG, "❌ 恢复遮罩失败", e)
        }
    }
    
    /**
     * Web操作期间的遮罩管理
     * 🔑 新策略：总是使用performWithBlockControl来临时移除触摸拦截
     */
    fun performWithMaskControl(operation: () -> Unit) {
        try {
            // 🔑 新策略：无论什么模式，都使用performWithBlockControl
            // 这样可以临时移除触摸拦截，让Web端操作穿透遮罩
            Log.d(TAG, "🔄 执行Web操作：临时移除触摸拦截，保持遮罩显示")
            inputBlockManager?.performWithBlockControl(operation)
        } catch (e: Exception) {
            Log.e(TAG, "❌ Web操作期间遮罩控制失败", e)
        }
    }

    
    /**
     * 清理资源
     */
    fun cleanup() {
        try {
            Log.d(TAG, "🧹 清理遮罩管理器资源")
            
            inputBlockManager?.cleanup()
            inputBlockManager = null
            
            Log.i(TAG, "✅ 遮罩管理器清理完成")
            
        } catch (e: Exception) {
            Log.e(TAG, "❌ 清理遮罩管理器失败", e)
        }
    }
    
    /**
     * 获取当前遮罩配置
     */
    fun getMaskConfig(): Map<String, Any> {
        return inputBlockManager?.getBlockConfig() ?: mapOf(
            "text" to "数据加载中\n请勿操作",
            "textSize" to 24f,
            "isBlocked" to false,
            "isWebOperation" to false,
            "hasBlockView" to false
        )
    }
} 