/**
 * 定时器管理 Hook
 * 自动管理定时器生命周期，防止内存泄漏
 *
 * @module composables/useTimeout
 * @description 提供类型安全的定时器管理，组件卸载时自动清理所有定时器
 */

import { ref, onUnmounted } from 'vue'

export interface TimeoutOptions {
  /**
   * 是否在组件卸载时自动清理所有定时器
   * @default true
   */
  autoCleanup?: boolean
}

/**
 * 定时器管理 Hook
 *
 * @param options - 配置选项
 * @returns 定时器管理方法
 *
 * @example
 * ```typescript
 * const { setTimeout, clearTimeout, clearAll } = useTimeout()
 *
 * // 设置延迟执行
 * const timer = setTimeout(() => {
 *   console.log('延迟执行')
 * }, 1000)
 *
 * // 清除特定定时器
 * clearTimeout(timer)
 *
 * // 清除所有定时器
 * clearAll()
 * ```
 */
export function useTimeout(options: TimeoutOptions = {}) {
  const { autoCleanup = true } = options

  // 使用 Set 存储所有定时器 ID
  const timers = ref<Set<NodeJS.Timeout>>(new Set())

  /**
   * 设置定时器（自动管理生命周期）
   * @param callback - 要执行的回调函数
   * @param delay - 延迟时间（毫秒）
   * @returns 定时器 ID
   */
  const setTimeout = <T = void>(
    callback: () => T,
    delay: number
  ): NodeJS.Timeout => {
    const timer = window.setTimeout(() => {
      try {
        callback()
      } finally {
        // 执行完成后自动从集合中移除
        timers.value.delete(timer)
      }
    }, delay)

    // 添加到集合中
    timers.value.add(timer)

    return timer
  }

  /**
   * 清除特定定时器
   * @param timer - 要清除的定时器 ID
   */
  const clearTimeout = (timer: NodeJS.Timeout) => {
    window.clearTimeout(timer)
    timers.value.delete(timer)
  }

  /**
   * 清除所有定时器
   */
  const clearAll = () => {
    timers.value.forEach((timer) => {
      window.clearTimeout(timer)
    })
    timers.value.clear()
  }

  /**
   * 获取当前活跃的定时器数量
   */
  const getActiveCount = () => timers.value.size

  // 组件卸载时自动清理
  if (autoCleanup) {
    onUnmounted(() => {
      clearAll()
    })
  }

  return {
    setTimeout,
    clearTimeout,
    clearAll,
    getActiveCount
  }
}

/**
 * 定时器管理 Hook 的别名
 * 便于语义化使用（如延迟执行、防抖等场景）
 */
export const useDelay = useTimeout

export default useTimeout
