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

/**
 * 自定义Hook用于模拟图片生成进度
 * 在30秒内从0%增长到99%，然后等待实际生成完成
 * 支持为每个实例添加个性化差异
 */
export const useGenerationProgress = (isGenerating: boolean, uniqueId?: string | number) => {
  const [progress, setProgress] = useState(0)
  const offsetRef = useRef<{ timeOffset: number; progressOffset: number } | null>(null)

  useEffect(() => {
    if (!isGenerating) {
      setProgress(0)
      offsetRef.current = null
      return
    }

    // 为每个实例生成独特的偏移量，基于唯一ID
    if (offsetRef.current === null) {
      const seed = uniqueId
        ? typeof uniqueId === 'string'
          ? uniqueId.split('').reduce((acc, char) => acc + char.charCodeAt(0), 0)
          : uniqueId
        : Math.random() * 1000

      // 生成-2到+3秒的时间偏移，让每个进度有差异
      const timeOffset = (seed % 5000) - 2000 // -2000ms 到 +3000ms
      // 生成5-15%的进度偏移
      const progressOffset = (seed % 10) + 5 // 5% 到 15%

      offsetRef.current = { timeOffset, progressOffset }
    }

    const { timeOffset, progressOffset } = offsetRef.current
    let startTime = Date.now() + timeOffset
    const duration = 35000 // 35秒基础时长
    const maxProgress = Math.min(99, 85 + progressOffset) // 85-99%的最大进度差异

    const updateProgress = () => {
      const elapsed = Date.now() - startTime
      const progressRatio = elapsed / duration

      if (progressRatio >= 1) {
        // 达到最大进度后保持
        setProgress(maxProgress)
        return
      }

      if (progressRatio < 0) {
        // 还未开始的情况
        setProgress(0)
        return
      }

      // 使用缓动函数让进度增长更自然
      // 前期增长较快，后期增长较慢
      const easeOutProgress = 1 - Math.pow(1 - progressRatio, 3)
      const currentProgress = Math.floor(easeOutProgress * maxProgress)

      setProgress(Math.max(currentProgress, 1)) // 确保至少显示1%
    }

    // 立即更新一次
    updateProgress()

    // 每100ms更新一次进度
    const interval = setInterval(updateProgress, 100)

    return () => {
      clearInterval(interval)
    }
  }, [isGenerating, uniqueId])

  return progress
}
