'use client'

import React, { createContext, useContext, ReactNode } from 'react'
import { DEFAULT_ORGANIZATION_BRANDING, Organization } from '@/types/organization/organization'

interface OrganizationContextType {
  organization: Organization | null
  isLoading: boolean
  refetch: () => Promise<void>
}

const OrganizationContext = createContext<OrganizationContextType | undefined>(undefined)

interface OrganizationProviderProps {
  children: ReactNode
  initialOrganization?: Organization | null
}

export const DUMMY_ORGANIZATION: Organization = {
  id: "00000000-0000-0000-0000-000000000000",
  code: "DUMMY_ORG",
  name: "Dummy Organization",
  address: {
    country: "ID",
  },
  branding: DEFAULT_ORGANIZATION_BRANDING
}

export function OrganizationProvider({ 
  children, 
  initialOrganization = DUMMY_ORGANIZATION
}: OrganizationProviderProps) {
  const [organization, setOrganization] = React.useState<Organization | null>(initialOrganization)
  const [isLoading, setIsLoading] = React.useState(!initialOrganization)

  const refetch = React.useCallback(async () => {
    if (typeof window === 'undefined') return
    
    setIsLoading(true)
    try {
      const { organizationService } = await import('@/services/organization/organizationService')
      const org = await organizationService.getCurrentOrganization(true)
      setOrganization(org)
    } catch (error) {
      console.error('Failed to refetch organization:', error)
    } finally {
      setIsLoading(false)
    }
  }, [])

  // Update state when initialOrganization changes (SSR hydration)
  React.useEffect(() => {
    if (initialOrganization && !organization) {
      setOrganization(initialOrganization)
      setIsLoading(false)
    }
  }, [initialOrganization, organization])

  const value = React.useMemo(() => ({
    organization,
    isLoading,
    refetch
  }), [organization, isLoading, refetch])

  return (
    <OrganizationContext.Provider value={value}>
      {children}
    </OrganizationContext.Provider>
  )
}

export function useOrganization() {
  const context = useContext(OrganizationContext)
  if (context === undefined) {
    throw new Error('useOrganization must be used within an OrganizationProvider')
  }
  return context
}
