'use client'

import { createContext, useContext, ReactNode } from 'react'
import { usePushNotifications } from '@/app/hooks/usePushNotifications'

type PushStatus = 'idle' | 'unsupported' | 'denied' | 'granted' | 'registering' | 'subscribed' | 'error'

interface PushNotificationsContextType {
  status: PushStatus
  registration: ServiceWorkerRegistration | null
  isSupported: boolean
  subscribe: () => Promise<{ success: boolean; error?: string }>
  unsubscribe: () => Promise<boolean>
  dismissPrompt: () => void
  shouldShowPrompt: boolean
}

const PushNotificationsContext = createContext<PushNotificationsContextType | undefined>(undefined)

// Nom du cookie pour tracker si l'utilisateur s'est désabonné volontairement
const UNSUBSCRIBED_COOKIE_NAME = 'owaspaces_push_unsubscribed'

// Fonction pour définir un cookie
function setCookie(name: string, value: string, days: number) {
  const date = new Date()
  date.setTime(date.getTime() + days * 24 * 60 * 60 * 1000)
  const expires = `expires=${date.toUTCString()}`
  document.cookie = `${name}=${value};${expires};path=/;SameSite=Lax`
}

// Fonction pour récupérer un cookie
function getCookie(name: string): string | null {
  if (typeof document === 'undefined') return null
  const nameEQ = `${name}=`
  const ca = document.cookie.split(';')
  for (let i = 0; i < ca.length; i++) {
    let c = ca[i]
    while (c.charAt(0) === ' ') c = c.substring(1, c.length)
    if (c.indexOf(nameEQ) === 0) return c.substring(nameEQ.length, c.length)
  }
  return null
}

// Fonction pour supprimer un cookie
function deleteCookie(name: string) {
  document.cookie = `${name}=;expires=Thu, 01 Jan 1970 00:00:00 UTC;path=/;`
}

interface PushNotificationsProviderProps {
  children: ReactNode
}

// Provider pour les notifications push qui encapsule le hook usePushNotifications
export function PushNotificationsProvider({ children }: PushNotificationsProviderProps) {
  const { status, registration, isSupported, subscribe: originalSubscribe } = usePushNotifications()

  // Déterminer si on doit afficher le popup
  // Condition: utilisateur non abonné ET pas de cookie de désabonnement volontaire
  const shouldShowPrompt = 
    status !== 'subscribed' && 
    status !== 'denied' && 
    status !== 'unsupported' &&
    status !== 'registering' &&
    getCookie(UNSUBSCRIBED_COOKIE_NAME) !== 'true'

  // Fonction pour s'abonner (supprime le cookie si présent)
  const subscribe = async () => {
    const result = await originalSubscribe()
    if (result.success) {
      // Si l'abonnement réussit, supprimer le cookie de désabonnement
      deleteCookie(UNSUBSCRIBED_COOKIE_NAME)
    }
    return result
  }

  // Fonction pour se désabonner des notifications push
  const unsubscribe = async (): Promise<boolean> => {
    if (!registration) {
      return false
    }

    try {
      const subscription = await registration.pushManager.getSubscription()
      if (subscription) {
        const success = await subscription.unsubscribe()
        if (success) {
          // Créer un cookie valable 1 an pour indiquer que l'utilisateur s'est désabonné volontairement
          setCookie(UNSUBSCRIBED_COOKIE_NAME, 'true', 365)
          // Recharger la page pour mettre à jour le statut
          window.location.reload()
        }
        return success
      }
      return false
    } catch (error) {
      console.error('Error unsubscribing from push notifications:', error)
      return false
    }
  }

  // Fonction pour fermer le prompt (crée le cookie "Plus tard")
  const dismissPrompt = () => {
    // Créer un cookie valable 1 an pour ne plus afficher le popup
    setCookie(UNSUBSCRIBED_COOKIE_NAME, 'true', 365)
  }

  return (
    <PushNotificationsContext.Provider
      value={{
        status,
        registration,
        isSupported,
        subscribe,
        unsubscribe,
        dismissPrompt,
        shouldShowPrompt,
      }}
    >
      {children}
    </PushNotificationsContext.Provider>
  )
}

// Hook personnalisé pour utiliser le contexte des notifications push
export function usePushNotificationsContext() {
  const context = useContext(PushNotificationsContext)
  if (context === undefined) {
    throw new Error('usePushNotificationsContext must be used within a PushNotificationsProvider')
  }
  return context
}

