'use client'

import { createContext, useContext, useEffect, useState, ReactNode } from 'react'
import { createClient } from '@/lib/supabase/client'
import { setBusinessContext, getBusinessContext, clearBusinessContext, BusinessContext } from '@/lib/api/agent'

interface BusinessProviderProps {
  children: ReactNode
}

const BusinessContextState = createContext<{
  business: BusinessContext | null
  loading: boolean
  refresh: () => Promise<void>
  setBusiness: (ctx: BusinessContext | null) => void
}>({
  business: null,
  loading: true,
  refresh: async () => {},
  setBusiness: () => {},
})

export function BusinessProvider({ children }: BusinessProviderProps) {
  const [business, setBusinessState] = useState<BusinessContext | null>(null)
  const [loading, setLoading] = useState(true)

  const refresh = async () => {
    const supabase = createClient()
    const { data: { user } } = await supabase.auth.getUser()
    if (!user) {
      setBusinessState(null)
      clearBusinessContext()
      setLoading(false)
      return
    }

    const { data: businesses } = await supabase
      .from('businesses')
      .select('id, name')
      .eq('owner_id', user.id)
      .limit(1)

    if (businesses && businesses.length > 0) {
      const ctx: BusinessContext = {
        businessId: businesses[0].id,
        businessName: businesses[0].name,
        userId: user.id,
        userEmail: user.email || '',
        userName: user.user_metadata?.full_name || user.email || 'User',
      }
      setBusinessState(ctx)
      setBusinessContext(ctx)
    } else {
      setBusinessState(null)
      clearBusinessContext()
    }
    setLoading(false)
  }

  const setBusiness = (ctx: BusinessContext | null) => {
    setBusinessState(ctx)
    if (ctx) {
      setBusinessContext(ctx)
    } else {
      clearBusinessContext()
    }
  }

  useEffect(() => {
    // Try cached context first for instant UI
    const cached = getBusinessContext()
    if (cached) {
      setBusinessState(cached)
      setLoading(false)
    }
    // Then refresh from server
    refresh()
  }, [])

  // Listen for auth changes
  useEffect(() => {
    const supabase = createClient()
    const { data: { subscription } } = supabase.auth.onAuthStateChange(() => {
      refresh()
    })
    return () => subscription.unsubscribe()
  }, [])

  return (
    <BusinessContextState.Provider value={{ business, loading, refresh, setBusiness }}>
      {children}
    </BusinessContextState.Provider>
  )
}

export function useBusiness() {
  const context = useContext(BusinessContextState)
  if (!context) {
    throw new Error('useBusiness must be used within a BusinessProvider')
  }
  return context
}