package com.narutohuo.xindazhou.common.executor

import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.Job
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
import java.util.concurrent.ConcurrentHashMap

/**
 * 执行器管理器
 * 
 * 业务层封装，提供便捷的异步任务执行方式
 * 直接使用 Kotlin Coroutines 实现，无需接口
 * 
 * 使用方式：
 * ```kotlin
 * // IO线程执行
 * ExecutorManager.executeIO {
 *     // 执行耗时操作
 * }
 * 
 * // 主线程执行
 * ExecutorManager.executeMain {
 *     // 更新UI
 * }
 * 
 * // 延迟执行
 * val taskId = ExecutorManager.executeDelayed(1000) {
 *     // 1秒后执行
 * }
 * 
 * // 取消任务
 * ExecutorManager.cancel(taskId)
 * ```
 */
object ExecutorManager {
    
    // 全局协程作用域（IO）
    private val ioScope = CoroutineScope(Dispatchers.IO)
    
    // 全局协程作用域（Main）
    private val mainScope = CoroutineScope(Dispatchers.Main)
    
    // 存储延迟任务，用于取消
    private val delayedTasks = ConcurrentHashMap<String, Job>()
    
    /**
     * 在 IO 线程执行
     * 
     * @param block 要执行的代码块
     */
    fun executeIO(block: suspend () -> Unit) {
        ioScope.launch {
            block()
        }
    }
    
    /**
     * 在主线程执行
     * 
     * @param block 要执行的代码块
     */
    fun executeMain(block: () -> Unit) {
        mainScope.launch {
            block()
        }
    }
    
    /**
     * 延迟执行
     * 
     * @param delayMillis 延迟时间（毫秒）
     * @param block 要执行的代码块
     * @return 任务ID，可用于取消任务
     */
    fun executeDelayed(delayMillis: Long, block: () -> Unit): String {
        val taskId = "task_${System.currentTimeMillis()}_${delayedTasks.size}"
        val job = mainScope.launch {
            delay(delayMillis)
            block()
            delayedTasks.remove(taskId)
        }
        delayedTasks[taskId] = job
        return taskId
    }
    
    /**
     * 取消任务
     * 
     * @param taskId 任务ID（通过 executeDelayed 返回）
     */
    fun cancel(taskId: String) {
        delayedTasks.remove(taskId)?.cancel()
    }
    
    /**
     * 取消所有延迟任务
     */
    fun cancelAll() {
        delayedTasks.values.forEach { it.cancel() }
        delayedTasks.clear()
    }
}

