"use client"

import { useEffect, useRef, useState } from "react"

/**
 * P0-竞品修复：考试倒计时 hook。
 *
 * 对标智学网/猿题库的限时考试功能：
 * - 学生开始作答后，根据 durationMinutes 计算截止时间
 * - 每秒更新剩余时间
 * - 剩余时间 ≤ 0 时触发 onExpire 回调（自动提交）
 * - 剩余时间 ≤ 5 分钟时标记为紧急状态（红色高亮）
 *
 * 设计要点：
 * - 使用 ref 存储 onExpire 回调避免闭包陷阱
 * - 使用 setInterval 每秒更新 state（Date.now 仅在 interval 回调中调用，
 *   不在 render 阶段调用，符合 react-hooks/purity 规则）
 * - setState 仅在 interval 回调中异步调用，不在 effect 体内同步执行
 * - 服务端时间偏差由调用方传入 startedAt（服务端 ISO 时间）缓解
 */

export interface ExamCountdownState {
  /** 剩余毫秒数（≤ 0 表示已到时） */
  remainingMs: number
  /** 剩余小时数 */
  hours: number
  /** 剩余分钟数（0-59） */
  minutes: number
  /** 剩余秒数（0-59） */
  seconds: number
  /** 是否已到时 */
  isExpired: boolean
  /** 是否进入紧急状态（≤ 5 分钟） */
  isUrgent: boolean
}

interface UseExamCountdownOptions {
  /** 考试时长（分钟），null 表示无限制 */
  durationMinutes: number | null
  /** 提交记录创建时间（ISO 字符串），用于计算截止时间 */
  startedAt: string | null
  /** 到时回调（仅触发一次） */
  onExpire?: () => void
  /** 是否启用（默认 true） */
  enabled?: boolean
}

const URGENT_THRESHOLD_MS = 5 * 60 * 1000 // 5 分钟
const TICK_INTERVAL_MS = 1000

const computeState = (remainingMs: number): ExamCountdownState => {
  const clamped = Math.max(0, remainingMs)
  const totalSeconds = Math.floor(clamped / 1000)
  const hours = Math.floor(totalSeconds / 3600)
  const minutes = Math.floor((totalSeconds % 3600) / 60)
  const seconds = totalSeconds % 60
  return {
    remainingMs: clamped,
    hours,
    minutes,
    seconds,
    isExpired: remainingMs <= 0,
    isUrgent: remainingMs > 0 && remainingMs <= URGENT_THRESHOLD_MS,
  }
}

const isStartTimeValid = (startedAt: string | null): boolean =>
  startedAt !== null && !Number.isNaN(new Date(startedAt).getTime())

export function useExamCountdown({
  durationMinutes,
  startedAt,
  onExpire,
  enabled = true,
}: UseExamCountdownOptions): ExamCountdownState | null {
  const [state, setState] = useState<ExamCountdownState | null>(null)
  const onExpireRef = useRef(onExpire)
  const expiredRef = useRef(false)

  // 保持 onExpire 回调最新，避免闭包陷阱
  useEffect(() => {
    onExpireRef.current = onExpire
  }, [onExpire])

  // 配置有效性（派生计算，无需 setState）
  const isConfigValid =
    enabled &&
    durationMinutes !== null &&
    durationMinutes > 0 &&
    isStartTimeValid(startedAt)

  // 启动每秒定时器：Date.now() 与 setState 均在 interval 回调中异步调用，
  // 不在 effect 体内同步执行，符合 react-hooks/set-state-in-effect 与 purity 规则
  useEffect(() => {
    if (!isConfigValid || !startedAt || durationMinutes === null) {
      return
    }

    const startTime = new Date(startedAt).getTime()
    const deadline = startTime + durationMinutes * 60 * 1000
    expiredRef.current = false

    const update = () => {
      const remaining = deadline - Date.now()
      setState(computeState(remaining))
      if (remaining <= 0 && !expiredRef.current) {
        expiredRef.current = true
        onExpireRef.current?.()
      }
    }

    const timer = setInterval(update, TICK_INTERVAL_MS)
    return () => clearInterval(timer)
  }, [isConfigValid, startedAt, durationMinutes])

  // 配置无效时不显示倒计时（state 旧值由 isConfigValid 守卫拦截）
  if (!isConfigValid) {
    return null
  }

  return state
}
