'use client'

/**
 * AnalysisYearContext - 분석 연도 선택 Context
 *
 * 기능:
 * - 현재 연도부터 5년 전까지 선택 가능 (예: 2025~2020)
 * - URL 파라미터 ?year=2024 와 동기화
 * - 농장의 가장 최근 분석 연도를 기본값으로 사용
 *
 * 사용처:
 * - site-header.tsx: 헤더 연도 선택 드롭다운
 * - genome-integrated-comparison.tsx: 선택된 연도로 데이터 조회
 * - gene-possession-status.tsx: 선택된 연도로 데이터 조회
 */

import React, { createContext, useContext, useState, useEffect, Suspense } from 'react'
import { useRouter, useSearchParams, usePathname } from 'next/navigation'

interface AnalysisYearContextType {
  selectedYear: number
  setSelectedYear: (year: number) => void
  availableYears: number[]
}

const AnalysisYearContext = createContext<AnalysisYearContextType | undefined>(undefined)

function AnalysisYearProviderInner({ children }: { children: React.ReactNode }) {
  const router = useRouter()
  const pathname = usePathname()
  const searchParams = useSearchParams()

  // 사용 가능한 분석 연도 목록 (현재 연도부터 과거 5년)
  const currentYear = new Date().getFullYear()
  const availableYears = Array.from({ length: 6 }, (_, i) => currentYear - i)

  // 초기 년도는 현재 년도로 설정 (클라이언트에서 useEffect로 업데이트)
  const [selectedYear, setSelectedYearState] = useState<number>(currentYear)
  const [isInitialized, setIsInitialized] = useState<boolean>(false)

  // 클라이언트 사이드에서만 실행: localStorage와 URL에서 초기 년도 설정
  useEffect(() => {
    if (isInitialized || typeof window === 'undefined') return

    const yearFromUrl = searchParams.get('year')
    if (yearFromUrl && !isNaN(Number(yearFromUrl))) {
      console.log('[AnalysisYear] Initial year from URL:', yearFromUrl)
      const year = Number(yearFromUrl)
      // availableYears에 포함된 년도만 사용
      const validYear = availableYears.includes(year) ? year : currentYear
      setSelectedYearState(validYear)
      setIsInitialized(true)
      // URL에 유효하지 않은 연도가 있으면 제거
      if (!availableYears.includes(year) && pathname !== '/') {
        const params = new URLSearchParams(searchParams.toString())
        params.delete('year')
        router.replace(params.toString() ? `${pathname}?${params.toString()}` : pathname)
      }
      return
    }

    const savedYear = localStorage.getItem('defaultAnalysisYear')
    if (savedYear && !isNaN(Number(savedYear))) {
      console.log('[AnalysisYear] Initial year from localStorage:', savedYear)
      const year = Number(savedYear)
      // availableYears에 포함된 년도만 사용 (없으면 현재 연도 사용)
      const validYear = availableYears.includes(year) ? year : currentYear
      setSelectedYearState(validYear)
      // URL에 year 파라미터 추가 (유효한 년도만, 루트 페이지 제외)
      if (pathname !== '/') {
        const params = new URLSearchParams(searchParams.toString())
        params.set('year', validYear.toString())
        router.replace(`${pathname}?${params.toString()}`)
      }
    }

    setIsInitialized(true)
    // eslint-disable-next-line react-hooks/exhaustive-deps
  }, []) // 의도적으로 빈 배열 사용 (최초 1회만 실행)

  // URL 파라미터와 동기화 (초기화 이후에만 실행)
  useEffect(() => {
    if (!isInitialized || pathname === '/') return // 루트 페이지에서는 실행 안 함

    const yearParam = searchParams.get('year')
    if (yearParam && !isNaN(Number(yearParam))) {
      const year = Number(yearParam)
      if (availableYears.includes(year)) {
        // 유효한 년도면 상태 업데이트
        if (year !== selectedYear) {
          setSelectedYearState(year)
        }
      } else {
        // 유효하지 않은 년도면 URL에서 제거하고 현재 연도로 설정
        const params = new URLSearchParams(searchParams.toString())
        params.delete('year')
        router.replace(params.toString() ? `${pathname}?${params.toString()}` : pathname)
        setSelectedYearState(currentYear)
      }
    }
  }, [searchParams, availableYears, isInitialized, selectedYear, currentYear, pathname, router])

  const setSelectedYear = (year: number) => {
    console.log('[AnalysisYear] setSelectedYear:', year)
    setSelectedYearState(year)

    // localStorage 업데이트 (사용자가 선택한 년도를 디폴트로 저장)
    if (typeof window !== 'undefined') {
      localStorage.setItem('defaultAnalysisYear', year.toString())
    }

    // URL 파라미터 업데이트
    const params = new URLSearchParams(searchParams.toString())
    params.set('year', year.toString())
    router.push(`${pathname}?${params.toString()}`)
  }

  return (
    <AnalysisYearContext.Provider value={{ selectedYear, setSelectedYear, availableYears }}>
      {children}
    </AnalysisYearContext.Provider>
  )
}

export function AnalysisYearProvider({ children }: { children: React.ReactNode }) {
  return (
    <Suspense fallback={null}>
      <AnalysisYearProviderInner>{children}</AnalysisYearProviderInner>
    </Suspense>
  )
}

export function useAnalysisYear() {
  const context = useContext(AnalysisYearContext)
  if (context === undefined) {
    throw new Error('useAnalysisYear must be used within an AnalysisYearProvider')
  }
  return context
}
