'use client'

import { useState, useEffect, useRef, ReactNode } from 'react'
import { SoundContext, useSound } from '@/hooks/useSound'

interface SoundProviderProps {
  children: ReactNode
}

export default function SoundProvider({ children }: SoundProviderProps) {
  const [enabled, setEnabled] = useState(false)
  const [preloaded, setPreloaded] = useState(false)
  const [hasAudioFiles, setHasAudioFiles] = useState(false)
  const droneStopRef = useRef<(() => void) | null>(null)
  const sound = useSound()

  // Preload audio files when sound is first enabled
  useEffect(() => {
    if (enabled && !preloaded) {
      sound.preloadAudio().then((success) => {
        setHasAudioFiles(success)
        setPreloaded(true)
      })
    }
  }, [enabled, preloaded, sound])

  // Start/stop ambient sound based on enabled state
  useEffect(() => {
    if (enabled && preloaded) {
      if (hasAudioFiles) {
        sound.startRain()
      } else {
        // Fallback to synthesized ambient drone
        droneStopRef.current = sound.playAmbientDrone()
      }
    } else if (!enabled) {
      sound.stopRain()
      if (droneStopRef.current) {
        droneStopRef.current()
        droneStopRef.current = null
      }
    }
  }, [enabled, preloaded, hasAudioFiles, sound])

  // Random thunder when enabled (only if audio files loaded)
  useEffect(() => {
    if (!enabled || !preloaded || !hasAudioFiles) return

    let thunderTimer: ReturnType<typeof setTimeout> | null = null
    const scheduleThunder = () => {
      // Random interval between 15-45 seconds
      const delay = 15000 + Math.random() * 30000
      thunderTimer = setTimeout(() => {
        if (enabled) {
          sound.playThunder()
          scheduleThunder()
        }
      }, delay)
    }

    // Initial delay before first thunder
    const initialDelay = setTimeout(() => {
      sound.playThunder()
    }, 8000)

    scheduleThunder()

    return () => {
      clearTimeout(initialDelay)
      if (thunderTimer) {
        clearTimeout(thunderTimer)
      }
    }
  }, [enabled, preloaded, hasAudioFiles, sound])

  return (
    <SoundContext.Provider value={{ enabled, setEnabled }}>
      {children}
    </SoundContext.Provider>
  )
}
