// ============================================================================
// PROVIDER PATTERN: FinanceContext.jsx
// Compartilhamento de estado global com React Context + Custom Confirm Dialog
// ============================================================================

const { createContext, useContext, useState, useEffect, useCallback } = React;

const FinanceContext = createContext(null);

function FinanceProvider({ children }) {
  const [theme, setTheme] = useState('light');
  const [services, setServices] = useState([]);
  const [recurringRules, setRecurringRules] = useState([]);
  const [tags, setTags] = useState([]);
  const [settings, setSettings] = useState({});
  const [toasts, setToasts] = useState([]);

  // Autenticação (Supabase Auth)
  const [session, setSession] = useState(null);
  const [isAuthChecking, setIsAuthChecking] = useState(true);

  // Modais de Entidades
  const [modalTxOpen, setModalTxOpen] = useState(false);
  const [editingTx, setEditingTx] = useState(null);
  const [modalServiceOpen, setModalServiceOpen] = useState(false);
  const [editingService, setEditingService] = useState(null);
  const [modalRecurringOpen, setModalRecurringOpen] = useState(false);
  const [editingRecurring, setEditingRecurring] = useState(null);
  const [modalTagOpen, setModalTagOpen] = useState(false);
  const [editingTag, setEditingTag] = useState(null);

  // Paleta de Comandos ⌘K & Modal de WhatsApp
  const [isCmdPaletteOpen, setIsCmdPaletteOpen] = useState(false);
  const [isWhatsAppModalOpen, setIsWhatsAppModalOpen] = useState(false);

  // Ficha Detalhada do Serviço / Entrega & Impressão Individual (Controle Interno)
  const [detailTx, setDetailTx] = useState(null);
  const [singlePrintTx, setSinglePrintTx] = useState(null);

  // Modal Customizado de Confirmação (Substituto do window.confirm / alert)
  const [confirmState, setConfirmState] = useState({
    isOpen: false,
    title: '',
    description: '',
    confirmText: 'Confirmar',
    cancelText: 'Cancelar',
    variant: 'default', // 'default' ou 'destructive'
    itemDetails: null,  // Objeto rico para exibir o que está sendo excluído
    resolveFn: null
  });

  const confirmDialog = useCallback(({
    title,
    description,
    confirmText = 'Confirmar',
    cancelText = 'Cancelar',
    variant = 'default',
    itemDetails = null
  }) => {
    return new Promise((resolve) => {
      setConfirmState({
        isOpen: true,
        title,
        description,
        confirmText,
        cancelText,
        variant,
        itemDetails,
        resolveFn: resolve
      });
    });
  }, []);

  const handleConfirmAction = useCallback(() => {
    if (confirmState.resolveFn) confirmState.resolveFn(true);
    setConfirmState(prev => ({ ...prev, isOpen: false, resolveFn: null }));
  }, [confirmState.resolveFn]);

  const handleCancelAction = useCallback(() => {
    if (confirmState.resolveFn) confirmState.resolveFn(false);
    setConfirmState(prev => ({ ...prev, isOpen: false, resolveFn: null }));
  }, [confirmState.resolveFn]);

  // Gatilho para recarregar dados
  const [refreshTrigger, setRefreshTrigger] = useState(0);
  const triggerRefresh = useCallback(() => setRefreshTrigger(prev => prev + 1), []);

  useEffect(() => {
    document.documentElement.setAttribute('data-theme', theme);
    localStorage.setItem('columbia_theme', theme);
  }, [theme]);

  const toggleTheme = () => setTheme(prev => (prev === 'dark' ? 'light' : 'dark'));

  const showToast = useCallback((message, duration = 3000) => {
    const id = Date.now() + Math.random();
    setToasts(prev => [...prev, { id, message }]);
    setTimeout(() => {
      setToasts(prev => prev.filter(t => t.id !== id));
    }, duration);
  }, []);

  // Checar e ouvir sessão de autenticação
  useEffect(() => {
    let unsubscribe = () => {};

    const initAuth = async () => {
      try {
        const curSession = await window.Api.getSession();
        setSession(curSession);
      } catch (err) {
        console.warn('Error checking initial session:', err);
      } finally {
        setIsAuthChecking(false);
      }

      unsubscribe = window.Api.onAuthStateChange((event, newSession) => {
        setSession(newSession);
        setIsAuthChecking(false);
      });
    };

    initAuth();
    return () => unsubscribe();
  }, []);

  const logout = useCallback(async () => {
    try {
      await window.Api.signOut();
      setSession(null);
    } catch (err) {
      console.warn('Logout error:', err);
    }
  }, []);

  // Determinación de Rol: Administrador vs Auditor Institucional (Facultad)
  const isAdmin = React.useMemo(() => {
    if (!session || !session.user) return false;
    const metaRole = session.user.user_metadata?.role;
    if (metaRole === 'admin') return true;
    if (metaRole === 'auditor' || metaRole === 'universidad' || metaRole === 'facultad') return false;

    const email = (session.user.email || '').toLowerCase();
    const adminEmail = (settings?.admin_email || 'a67mkt@gmail.com').toLowerCase();
    
    // Si coincide con el email de admin o contiene 'admin'
    if (email === adminEmail || email.includes('admin') || email === 'collinsalan' || email === 'studiocollinsfotovideo@gmail.com') {
      return true;
    }

    // Por seguridad estricta: todo otro usuario es Auditor (Solo Lectura)
    return false;
  }, [session, settings]);

  const loadMetadata = useCallback(async () => {
    try {
      const [srvList, recList, tagList, setObj] = await Promise.all([
        window.Api.getServices(),
        window.Api.getRecurringRules(),
        window.Api.getTags(),
        window.Api.getSettings()
      ]);
      setServices(srvList || []);
      setRecurringRules(recList || []);
      setTags(tagList || []);
      setSettings(setObj || {});
    } catch (err) {
      console.error('Metadata load error:', err);
    }
  }, []);

  useEffect(() => {
    if (session) {
      loadMetadata();
    }
  }, [session, refreshTrigger, loadMetadata]);

  // Atajos de teclado globales (Cmd+K / Ctrl+K)
  useEffect(() => {
    const handleKeyDown = (e) => {
      if ((e.metaKey || e.ctrlKey) && e.key.toLowerCase() === 'k') {
        e.preventDefault();
        setIsCmdPaletteOpen(prev => !prev);
      }
    };
    window.addEventListener('keydown', handleKeyDown);
    return () => window.removeEventListener('keydown', handleKeyDown);
  }, []);

  const value = {
    // Autenticación & Roles
    session,
    user: session?.user || null,
    isAdmin,
    isAuthChecking,
    logout,
    setSession,
    theme,
    toggleTheme,
    services,
    recurringRules,
    tags,
    setTags,
    settings,
    toasts,
    showToast,
    refreshTrigger,
    triggerRefresh,
    modalTxOpen,
    setModalTxOpen,
    editingTx,
    setEditingTx,
    modalServiceOpen,
    setModalServiceOpen,
    editingService,
    setEditingService,
    modalRecurringOpen,
    setModalRecurringOpen,
    editingRecurring,
    setEditingRecurring,
    modalTagOpen,
    setModalTagOpen,
    editingTag,
    setEditingTag,
    // Paleta de Comandos ⌘K & WhatsApp
    isCmdPaletteOpen,
    setIsCmdPaletteOpen,
    isWhatsAppModalOpen,
    setIsWhatsAppModalOpen,
    // Ficha Detalhada & Impressão Individual (Controle Interno)
    detailTx,
    setDetailTx,
    singlePrintTx,
    setSinglePrintTx,
    // Custom Confirmation Dialog
    confirmDialog,
    confirmState,
    handleConfirmAction,
    handleCancelAction
  };

  return <FinanceContext.Provider value={value}>{children}</FinanceContext.Provider>;
}

function useFinance() {
  const context = useContext(FinanceContext);
  if (!context) throw new Error('useFinance deve ser usado dentro de FinanceProvider');
  return context;
}

window.FinanceProvider = FinanceProvider;
window.useFinance = useFinance;
