/**
 * 轻量 toast 提示 composable — 消除 AiChat / Settings / Projects / TaskDetail 4 处重复。
 *
 * 原 4 处各自 reactive/ref + _toastTimer + showToast + onUnmounted 清理,
 * 且 Projects 用 4000ms 其余 3000ms(体验不一致 bug)。
 * 本 composable 统一默认 3000ms,支持调用方按需传 durationMs。
 *
 * 用法:
 *   const { toast, showToast } = useToast()
 *   showToast('保存成功')
 *   showToast('导入失败', 'error', 4000)
 *   // template: <div v-if="toast.visible" class="toast ...">{{ toast.msg }}</div>
 */
import { reactive, onUnmounted } from 'vue'

// P0-2: 加 'success'(保存成功用绿色 toast,此前成功/中性都用 info 致反馈不明确)
export type ToastType = 'info' | 'error' | 'warning' | 'success'

export interface ToastState {
  visible: boolean
  msg: string
  type: ToastType
}

let _timer: ReturnType<typeof setTimeout> | null = null

export function useToast(defaultDurationMs = 3000) {
  const toast = reactive<ToastState>({
    visible: false,
    msg: '',
    type: 'info',
  })

  function showToast(msg: string, type: ToastType = 'info', durationMs?: number) {
    toast.msg = msg
    toast.type = type
    toast.visible = true
    if (_timer) clearTimeout(_timer)
    _timer = setTimeout(() => {
      toast.visible = false
    }, durationMs ?? defaultDurationMs)
  }

  function hideToast() {
    if (_timer) {
      clearTimeout(_timer)
      _timer = null
    }
    toast.visible = false
  }

  onUnmounted(() => {
    if (_timer) {
      clearTimeout(_timer)
      _timer = null
    }
  })

  return { toast, showToast, hideToast }
}
