import { StrictMode } from 'react'
import { createRoot } from 'react-dom/client'
import { BrowserRouter } from 'react-router-dom'
import { ThemeProvider } from '@/hooks/use-theme'
import App from './App.tsx'
import './index.css'

// Service Worker Registration (apenas em produção - em dev ele fica "preso"
// no navegador entre restarts do servidor e passa a interceptar/travar requisições).
// Checagem em runtime (não import.meta.env.PROD): esse build (Vite + SWC) estava
// eliminando o bloco inteiro como código morto quando a condição usava a constante
// de build, então o SW nunca era registrado em produção nenhuma - confirmado
// via teste direto (marcador só sobrevive ao build sem o import.meta.env.PROD).
const isLocalDev = ['localhost', '127.0.0.1'].includes(window.location.hostname);
if (!isLocalDev && 'serviceWorker' in navigator) {
  // Script type="module" executa de forma assíncrona/adiada; o evento 'load'
  // pode já ter disparado antes desse código rodar, e um listener adicionado
  // depois nunca é chamado. Registra direto se a página já carregou.
  const registerSW = () => {
    navigator.serviceWorker.register('/sw.js', {
      scope: '/'
    }).then((registration) => {
      console.log('Service Worker registrado com sucesso:', registration);
      
      // Listen for updates
      registration.addEventListener('updatefound', () => {
        const newWorker = registration.installing;
        if (newWorker) {
          console.log('Nova versão do Service Worker encontrada');
          
          newWorker.addEventListener('statechange', () => {
            if (newWorker.state === 'installed' && navigator.serviceWorker.controller) {
              // Nova versão disponível
              window.dispatchEvent(new CustomEvent('sw-update-available', {
                detail: { registration }
              }));
            }
          });
        }
      });
      
      // Check for existing service worker updates
      if (registration.waiting) {
        window.dispatchEvent(new CustomEvent('sw-update-available', {
          detail: { registration }
        }));
      }
      
    }).catch((error) => {
      console.error('Service Worker registration failed:', error);
    });
    
    // Listen for messages from service worker
    navigator.serviceWorker.addEventListener('message', (event) => {
      const { data } = event;
      
      if (data.type === 'SW_UPDATED') {
        console.log('Service Worker atualizado:', data.version);
        window.dispatchEvent(new CustomEvent('sw-updated', {
          detail: { version: data.version, message: data.message }
        }));
      }
      
      if (data.type === 'SW_ACTIVATED') {
        console.log('Service Worker ativado:', data.version);
        window.dispatchEvent(new CustomEvent('sw-activated', {
          detail: { version: data.version, message: data.message }
        }));
      }
      
      if (data.type === 'FORCE_RELOAD') {
        window.location.reload();
      }
    });
    
    // Handle page visibility changes for updates
    document.addEventListener('visibilitychange', () => {
      if (!document.hidden) {
        navigator.serviceWorker.getRegistration().then((registration) => {
          if (registration) {
            registration.update();
          }
        });
      }
    });
  };

  if (document.readyState === 'complete') {
    registerSW();
  } else {
    window.addEventListener('load', registerSW);
  }
}

createRoot(document.getElementById("root")!).render(
  <StrictMode>
    <BrowserRouter
      future={{
        // React Router v7 Future Flags suportadas pelo <BrowserRouter> nesta versão
        // (react-router-dom 6.x). As demais v7_* flags só se aplicam aos data
        // routers (createBrowserRouter/RouterProvider), não a este componente.
        v7_startTransition: true,        // Usa React.startTransition para navegação
        v7_relativeSplatPath: true       // Corrige comportamento de splat paths relativos
      }}
    >
      <ThemeProvider defaultTheme="light" storageKey="2data-theme">
        <App />
      </ThemeProvider>
    </BrowserRouter>
  </StrictMode>
);
