import { createRoot } from 'react-dom/client';
import { QueryClientProvider } from '@tanstack/react-query';
import * as Sentry from '@sentry/react';
import App from './App';
import { ErrorBoundary } from './components/ErrorBoundary';
import { ThemeProvider } from './contexts/ThemeContext';
import { MercadoLivreIntegrationsProvider } from './contexts/MercadoLivreIntegrationsContext';
// Contexts SOLID
import { UserProvider } from './contexts/UserContext';
import { AuthGate } from './components/auth/AuthGate';
import { ToolsProvider } from './contexts/ToolsContext';
import { FeatureProvider } from './contexts/FeatureContext';
import { StoreProvider } from './contexts/StoreContext';
import { setupFetchInterceptor } from './utils/fetchInterceptor';
import { queryClient } from './lib/queryClient';
import { reportWebVitals } from './reportWebVitals';
import '@fontsource/iosevka/700.css';
import './index.css';

// Inicializar GlitchTip (compatível com Sentry SDK)
if (import.meta.env.VITE_SENTRY_DSN) {
  Sentry.init({
    dsn: import.meta.env.VITE_SENTRY_DSN,
    environment: import.meta.env.MODE,
    // Rastreamento de performance
    integrations: [
      Sentry.browserTracingIntegration(),
      Sentry.replayIntegration(),
    ],
    // Captura 100% dos erros
    tracesSampleRate: 1.0,
    // Captura apenas replays de sessões com erro
    replaysSessionSampleRate: 0.0,
    replaysOnErrorSampleRate: 1.0,

    /* front#701 — REDE DE SEGURANÇA CONTRA DADO SENSÍVEL NO BREADCRUMB.
       O SDK captura `console.*` como breadcrumb por padrão, e com o replay
       ligado toda sessão com erro é gravada. Um `console.log` distraído em
       qualquer ponto do app manda o que estiver nele para o GlitchTip.

       Foi o que aconteceu com a chave PIX do saque: o log de origem já foi
       corrigido, mas corrigir a origem não impede o PRÓXIMO. Esta peneira é o
       que torna o descuido inofensivo em vez de incidente.

       Só descarta o breadcrumb: o erro em si continua chegando inteiro. */
    beforeBreadcrumb(breadcrumb) {
      if (breadcrumb.category !== 'console') return breadcrumb;

      const texto = JSON.stringify(breadcrumb.data ?? '') + (breadcrumb.message ?? '');
      const SENSIVEL = /pix[_-]?key|chavepix|\bcpf\b|\bcnpj\b|senha|password|secret|authorization|cart[aã]o|cvv/i;

      return SENSIVEL.test(texto) ? null : breadcrumb;
    },
  });
}

// ✅ Captura erros globais não tratados (que podem não ser pegos pelo ErrorBoundary)
window.addEventListener('error', (event) => {
  console.error('🚨 Erro não tratado capturado globalmente:');
  console.error('Mensagem:', event.message);
  console.error('Arquivo:', event.filename);
  console.error('Linha:', event.lineno);
  console.error('Coluna:', event.colno);
  console.error('Erro:', event.error);
  
  if (import.meta.env.VITE_SENTRY_DSN && event.error) {
    Sentry.captureException(event.error, {
      tags: { 
        globalHandler: true,
        filename: event.filename 
      }
    });
  }
});

// ✅ Captura promises rejeitadas não tratadas
window.addEventListener('unhandledrejection', (event) => {
  console.error('🚨 Promise rejeitada não tratada:');
  console.error('Motivo:', event.reason);
  
  if (import.meta.env.VITE_SENTRY_DSN) {
    Sentry.captureException(event.reason, {
      tags: { 
        globalHandler: true,
        type: 'unhandledRejection'
      }
    });
  }
});

// Configurar interceptor de fetch antes de qualquer requisição
setupFetchInterceptor();

createRoot(document.getElementById('root')!).render(
  // StrictMode desabilitado - causava dupla renderização e piscadas visuais
  // Re-habilitar apenas para debug de problemas específicos
  // <StrictMode>
    <ErrorBoundary>
      <QueryClientProvider client={queryClient}>
        <ThemeProvider>
          {/* Contexts SOLID */}
          <UserProvider>
            {/* AuthGate: bloqueia providers autenticados até JWT estar pronto */}
            <AuthGate>
              <ToolsProvider>
                <FeatureProvider>
                  {/* MercadoLivre precisa vir ANTES de StoreProvider */}
                  <MercadoLivreIntegrationsProvider>
                    <StoreProvider>
                      <App />
                    </StoreProvider>
                  </MercadoLivreIntegrationsProvider>
                </FeatureProvider>
              </ToolsProvider>
            </AuthGate>
          </UserProvider>
        </ThemeProvider>
      </QueryClientProvider>
    </ErrorBoundary>
  // </StrictMode>
);

// Iniciar coleta de Web Vitals (apenas em produção para evitar poluir analytics em dev)
if (import.meta.env.PROD) {
  reportWebVitals();
}