/**
 * main.jsx — Punto de entrada de Konty SPA
 *
 * ─── PASOS MANUALES PARA PHASE 2 · SUBDOMINIOS ────────────────────────────
 *
 * 1. CLERK — Configurar production domain:
 *    - Ir a https://dashboard.clerk.com → instance de producción de Konty
 *    - Configure → Domains → Add production domain → "konty.online"
 *    - Completar el TXT record que Clerk pide para verificar el dominio.
 *    - LISTO. Clerk setea la cookie __session con Domain=.konty.online y se
 *      comparte automáticamente entre konty.online, app.konty.online y
 *      cualquier subdominio de workspace (firma1.konty.online, etc).
 *    - NO uses "satellite domain" — esa feature es para dominios totalmente
 *      distintos (konty.com + konty.io), no para subdominios del mismo root.
 *
 * 2. DNS en Hostinger (o proveedor de DNS):
 *    - Crear registro A wildcard: *.konty.online → <IP del servidor>
 *    - Ver PHASE-2-DEPLOY.md para las 3 opciones de hosting + pros/cons.
 *
 * 3. Variables de entorno:
 *    - Agregar VITE_ROOT_DOMAIN=konty.online en .env.production
 *      (y en el panel de build de Hostinger/Vercel).
 *
 * 4. Test rápido en dev (sin DNS wildcard):
 *    - Acceder como: http://localhost:5180/?ws=mi-slug
 *    - O con lvh.me:  http://mi-slug.lvh.me:5180  (sin instalar nada).
 * ──────────────────────────────────────────────────────────────────────────
 */

import React from 'react'
import ReactDOM from 'react-dom/client'
import { BrowserRouter as Router, Routes, Route, Navigate } from 'react-router-dom'
import { ClerkProvider, useAuth, AuthenticateWithRedirectCallback } from '@clerk/clerk-react'
import { ConvexProviderWithClerk } from 'convex/react-clerk'
import * as Sentry from '@sentry/react'
import { convex } from './lib/convex.js'
import './index.css'

// ─── Sentry: arrancar solo si VITE_SENTRY_DSN está definido ──────────────────
// Para activar: agrega VITE_SENTRY_DSN=https://xxx@sentry.io/yyy en .env.local
// y sube source maps en producción con el Vite plugin de Sentry.
// Pendiente del usuario: obtener DSN en https://sentry.io → Project settings → Client Keys
if (import.meta.env.VITE_SENTRY_DSN) {
    Sentry.init({
        dsn: import.meta.env.VITE_SENTRY_DSN,
        environment: import.meta.env.MODE,
        tracesSampleRate: import.meta.env.PROD ? 0.2 : 1.0,
        // Source maps: configurar @sentry/vite-plugin en vite.config.js
        // (ver nota al pie en convex/email/send.ts)
    });
    console.log('[SENTRY] Inicializado en entorno:', import.meta.env.MODE);
}

// Providers
import { AuthProvider } from './contexts/AuthContext.jsx'
import { AppProvider } from './contexts/AppContext.jsx'
import { WorkspaceProvider } from './contexts/WorkspaceContext.jsx'
import { NotificationProvider } from './components/NotificationSystem.jsx'
import ErrorBoundary from './components/ErrorBoundary.jsx'

// Pages
import Landing from './views/Landing.jsx'
import SignIn from './views/SignIn.jsx'
import SignUp from './views/signup/SignUp.jsx'
import Onboarding from './views/Onboarding.jsx'
import App from './App.jsx'
import AuthGuard from './components/AuthGuard.jsx'
import InviteAccept from './views/InviteAccept.jsx'
import BootstrapLoader from './components/BootstrapLoader.jsx'

// Get Clerk publishable key
const CLERK_PUBLISHABLE_KEY = import.meta.env.VITE_CLERK_PUBLISHABLE_KEY

if (!CLERK_PUBLISHABLE_KEY) {
    throw new Error("Missing Clerk Publishable Key")
}

// ── Phase 2: Multi-subdomain auth ──────────────────────────────────────────
// IMPORTANTE: NO usamos `isSatellite` porque esa feature de Clerk es para
// dominios totalmente distintos (ej. konty.com + konty.io), no para subdominios
// del mismo root domain. Para `*.konty.online`, Clerk setea la cookie con
// Domain=.konty.online cuando configuras `konty.online` como production domain
// en el dashboard, y se comparte automáticamente entre TODOS los subdominios.
//
// Pasos manuales requeridos UNA VEZ en Clerk Dashboard (production instance):
//   1. Configure → Domains → Add production domain → "konty.online"
//   2. Verificar el dominio (DNS TXT que Clerk pide).
// Eso es todo. Cada subdominio servirá el mismo SPA y la cookie de sesión los
// reconocerá. NO agregues subdominios uno por uno — es 1 production domain.

// Hydrate the accent color the user picked during onboarding so the rest of
// the app uses it from the first paint.
try {
    const prefs = JSON.parse(localStorage.getItem('konty_workspace_prefs') || '{}');
    if (prefs.brandColor) {
        document.documentElement.dataset.accent = prefs.brandColor;
    }
} catch {}

ReactDOM.createRoot(document.getElementById('root')).render(
  <React.StrictMode>
      <ClerkProvider
        publishableKey={CLERK_PUBLISHABLE_KEY}
        signInUrl="/sign-in"
        signUpUrl="/sign-up"
        signInFallbackRedirectUrl="/dashboard"
        signUpFallbackRedirectUrl="/dashboard"
        signInForceRedirectUrl="/dashboard"
        signUpForceRedirectUrl="/dashboard"
      >
       <ConvexProviderWithClerk client={convex} useAuth={useAuth}>
        <NotificationProvider>
          <AuthProvider>
            <WorkspaceProvider>
            <AppProvider>
              <Router>
    <ErrorBoundary>
                <AuthGuard>
                  <Routes>
                    {/* Public Routes */}
                    <Route path="/" element={<Landing />} />
                    <Route path="/sign-in" element={<SignIn />} />
                    <Route path="/sign-up" element={<SignUp />} />
                  
                    {/* Onboarding Route */}
                    <Route path="/onboarding" element={<Onboarding />} />

                    {/* Invite accept — público (el componente maneja auth interno) */}
                    <Route path="/invite/:token" element={<InviteAccept />} />

                    {/* Clerk OAuth callback (Google, etc.) → AuthGuard decide /onboarding o /dashboard */}
                    <Route
                      path="/sso-callback"
                      element={
                        <>
                          <BootstrapLoader message="Iniciando sesión con Google" />
                          <AuthenticateWithRedirectCallback signInForceRedirectUrl="/dashboard" signUpForceRedirectUrl="/onboarding" />
                        </>
                      }
                    />
                  
                    {/* Protected Routes */}
                    <Route path="/dashboard/*" element={<App />} />
                  
                    {/* Catch all route - redirect to landing */}
                    <Route path="*" element={<Navigate to="/" replace />} />
                  </Routes>
                </AuthGuard>
    </ErrorBoundary>
              </Router>
            </AppProvider>
            </WorkspaceProvider>
          </AuthProvider>
        </NotificationProvider>
       </ConvexProviderWithClerk>
      </ClerkProvider>
  </React.StrictMode>,
)