import { createRoot } from 'react-dom/client'
import { useEffect } from 'react'
import './index.css'

/**
 * Boot sequence (multi-tenant):
 * 1. Carrega /tenants.json (registry de subdomínio → Supabase) e expõe em
 *    window.__TENANTS__ ANTES de qualquer módulo que importe o client.
 * 2. Importa dinamicamente App + supabase client (que então resolve o tenant
 *    correto via src/lib/supabaseEnv.ts).
 * 3. Em DEV (Lovable/localhost) o registry vem vazio e cai no .env automaticamente.
 */
async function loadTenantsRegistry() {
  try {
    const res = await fetch('/tenants.json', { cache: 'no-store' });
    if (!res.ok) throw new Error(`HTTP ${res.status}`);
    const json = await res.json();
    (window as any).__TENANTS__ = json?.tenants || {};
  } catch (err) {
    console.warn('[tenants] falha ao carregar /tenants.json — usando .env fallback', err);
    (window as any).__TENANTS__ = {};
  }
}

async function boot() {
  await loadTenantsRegistry();

  const [{ default: App }, { supabase }, { ThemeProvider }] = await Promise.all([
    import('./App.tsx'),
    import('./integrations/supabase/client'),
    import('./components/theme/ThemeProvider'),
  ]);

  function BrandingInjector({ children }: { children: React.ReactNode }) {
    useEffect(() => {
      let cancelled = false;
      (async () => {
        try {
          const { data } = await supabase
            .from('system_configurations')
            .select('key, value')
            .eq('category', 'branding')
            .eq('key', 'platform_name')
            .maybeSingle();
          if (cancelled || !data) return;
          let name: any = data.value;
          try { name = typeof name === 'string' ? JSON.parse(name) : name; } catch {}
          if (typeof name === 'string' && name) document.title = name;
        } catch { /* noop */ }
      })();
      return () => { cancelled = true; };
    }, []);
    return <>{children}</>;
  }

  createRoot(document.getElementById('root')!).render(
    <ThemeProvider>
      <BrandingInjector>
        <App />
      </BrandingInjector>
    </ThemeProvider>
  );
}

boot();
