"use client"

import { createContext, useContext, useEffect, useState, type ReactNode } from "react"

type Consent = "accepted" | "refused" | null

interface CookieConsentCtx {
  consent: Consent
  showBanner: boolean
  accept: () => void
  refuse: () => void
  reset: () => void
}

const COOKIE_KEY = "sar_cookie_consent"
const COOKIE_EXPIRY_DAYS = 365

function setCookieValue(value: string, days: number) {
  const expires = new Date()
  expires.setTime(expires.getTime() + days * 24 * 60 * 60 * 1000)
  document.cookie = `${COOKIE_KEY}=${value};expires=${expires.toUTCString()};path=/;SameSite=Lax`
}

function getCookieValue(): string | null {
  if (typeof document === "undefined") return null
  const match = document.cookie.split("; ").find((row) => row.startsWith(`${COOKIE_KEY}=`))
  return match ? match.split("=")[1] : null
}

const CookieConsentContext = createContext<CookieConsentCtx>({
  consent: "accepted",
  showBanner: false,
  accept: () => {},
  refuse: () => {},
  reset: () => {},
})

export function useCookieConsent() {
  return useContext(CookieConsentContext)
}

export function CookieConsentProvider({ children }: { children: ReactNode }) {
  // Consentement implicite a l'arrivee : le visiteur qui ouvre le site consent,
  // et ce consentement vaut pour tout le site. Les contenus tiers (cartes,
  // publications, videos) s'affichent donc immediatement, sans cadre d'attente.
  // La banniere reste affichee pour informer et laisser la possibilite de
  // refuser ; un refus explicite regele les contenus tiers.
  const [consent, setConsent] = useState<Consent>("accepted")
  const [showBanner, setShowBanner] = useState(false)

  useEffect(() => {
    const stored = getCookieValue()
    if (stored === "accepted" || stored === "refused") {
      setConsent(stored)
      setShowBanner(false)
      return
    }
    // Petit delai pour eviter le flash au chargement
    const timer = setTimeout(() => setShowBanner(true), 800)
    return () => clearTimeout(timer)
  }, [])

  const accept = () => {
    setCookieValue("accepted", COOKIE_EXPIRY_DAYS)
    setConsent("accepted")
    setShowBanner(false)
  }

  const refuse = () => {
    setCookieValue("refused", COOKIE_EXPIRY_DAYS)
    setConsent("refused")
    setShowBanner(false)
  }

  const reset = () => {
    document.cookie = `${COOKIE_KEY}=;expires=Thu, 01 Jan 1970 00:00:00 UTC;path=/`
    setConsent(null)
    setShowBanner(true)
  }

  return (
    <CookieConsentContext.Provider value={{ consent, showBanner, accept, refuse, reset }}>
      {children}
    </CookieConsentContext.Provider>
  )
}
