'use client';

import React, { createContext, useContext, useState, useEffect, useCallback } from 'react';
import { useAuth } from '@/lib/auth';
import { getUserOrganizations, Organization } from '@/services/api/organization';

interface OrganizationContextType {
  /** 当前用户可访问的组织列表 */
  organizations: Organization[];
  /** 当前选中的组织 */
  currentOrganization: Organization | null;
  /** 切换当前组织 */
  setCurrentOrganization: (org: Organization | null) => void;
  /** 加载状态 */
  loading: boolean;
  /** 重新加载组织列表 */
  reload: () => Promise<void>;
}

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

const STORAGE_KEY = 'selected_organization_id';

export function OrganizationProvider({ children }: { children: React.ReactNode }) {
  const { user, loading: authLoading } = useAuth();
  const [organizations, setOrganizations] = useState<Organization[]>([]);
  const [currentOrganization, setCurrentOrganizationState] = useState<Organization | null>(null);
  const [loading, setLoading] = useState(true);

  const loadOrganizations = useCallback(async () => {
    if (!user?.id) {
      setOrganizations([]);
      setCurrentOrganizationState(null);
      setLoading(false);
      return;
    }

    try {
      setLoading(true);
      const orgs = await getUserOrganizations(user.id);
      setOrganizations(orgs);

      // 尝试从 localStorage 恢复上次选择的组织
      const savedOrgId = localStorage.getItem(STORAGE_KEY);
      let selectedOrg: Organization | null = null;

      if (savedOrgId) {
        selectedOrg = orgs.find(o => o.id === savedOrgId) || null;
      }

      // 如果没有保存的或保存的不在列表中，默认 null（全部组织）
      // selectedOrg 保持 null 表示"全部组织"

      setCurrentOrganizationState(selectedOrg);
    } catch (error) {
      console.error('[OrganizationContext] Failed to load organizations:', error);
      setOrganizations([]);
      setCurrentOrganizationState(null);
    } finally {
      setLoading(false);
    }
  }, [user?.id]);

  useEffect(() => {
    if (!authLoading) {
      loadOrganizations();
    }
  }, [authLoading, loadOrganizations]);

  const setCurrentOrganization = useCallback((org: Organization | null) => {
    setCurrentOrganizationState(org);
    if (org) {
      localStorage.setItem(STORAGE_KEY, org.id);
    } else {
      localStorage.removeItem(STORAGE_KEY);
    }
  }, []);

  const value: OrganizationContextType = {
    organizations,
    currentOrganization,
    setCurrentOrganization,
    loading,
    reload: loadOrganizations,
  };

  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;
}
