import { createRoot } from "react-dom/client";
import App from "./App.tsx";
import "./index.css";
import { supabase } from "@/integrations/supabase/client";
import { queryClient } from "@/lib/queryClient";

// Reset de sessão único por aparelho.
// Ao trocar APP_SESSION_VERSION, todos os aparelhos conectados executam UMA
// vez: soltam realtime, deslogam, limpam cache e recarregam. Depois gravam
// a versão no localStorage e nunca mais repetem — até a constante mudar.
const APP_SESSION_VERSION = "2026-09-24-2";
(function enforceSessionVersion() {
  let already: string | null = null;
  try {
    already = localStorage.getItem("app_session_version");
  } catch {
    return; // storage bloqueado: melhor abrir normal do que arriscar loop
  }
  if (already === APP_SESSION_VERSION) return;
  // Grava a versão PRIMEIRO, de forma síncrona. Se qualquer passo abaixo
  // falhar (rede caída, signOut pendurado), o aparelho NUNCA repete o
  // reset — elimina o risco de loop infinito de reload (tela preta).
  try {
    localStorage.setItem("app_session_version", APP_SESSION_VERSION);
  } catch {
    return; // não conseguiu gravar: não faz nada pra não loopar
  }
  // Trava extra: no máximo 1 reload por aba, mesmo se algo disparar 2x.
  try {
    if (sessionStorage.getItem("app-session-reset-reloading")) return;
    sessionStorage.setItem("app-session-reset-reloading", "1");
  } catch {
    return;
  }
  // Roda ATRÁS do boot: espera o app pintar a tela antes de limpar e
  // recarregar — nada de cortar o carregamento no meio em celular lento.
  window.setTimeout(() => {
    (async () => {
      try {
        supabase.realtime.getChannels().forEach((ch) => {
          try { supabase.removeChannel(ch); } catch {}
        });
        try { supabase.realtime.disconnect(); } catch {}
        await supabase.auth.signOut({ scope: "local" }).catch(() => {});
        queryClient.clear();
      } finally {
        window.location.reload();
      }
    })();
  }, 1500);
})();

// Só registra o Service Worker no domínio de produção real.
// Qualquer outro host (staging, iframes, ambientes efêmeros) desregistra
// SW existente pra não travar em cache de bundle antigo.
const isInIframe = (() => {
  try { return window.self !== window.top; } catch { return true; }
})();
const PRODUCTION_HOSTS = new Set(["www.huummburguer.com", "huummburguer.com"]);
const isProductionHost = PRODUCTION_HOSTS.has(window.location.hostname);

if ("serviceWorker" in navigator && !isInIframe && isProductionHost) {
  window.addEventListener("load", () => {
    // Round 49: query param força browser/CDN a buscar sw.js novo, evitando
    // reaproveitar script antigo cacheado.
    navigator.serviceWorker.register("/sw.js?v=22").then((reg) => {
      // Force check for new SW version on every load
      reg.update().catch(() => {});
      // When a new SW takes control, reload to use fresh bundle
      let refreshing = false;
      navigator.serviceWorker.addEventListener("controllerchange", () => {
        if (refreshing) return;
        refreshing = true;
        // Proteção extra: só recarrega 1x por sessão. Sem isso o reg.update()
        // que roda a cada load podia disparar reload no meio de scroll mobile,
        // dando a impressão de "página recarregando sozinha".
        try {
          if (sessionStorage.getItem("sw-controller-reloaded")) return;
          sessionStorage.setItem("sw-controller-reloaded", "1");
        } catch {
          return;
        }
        window.location.reload();
      });
    }).catch(() => {});
  });
  // Round 48: SW novo manda RELOAD_REQUIRED no activate. Recarrega uma vez
  // por sessão pra garantir que bundles novos rodem (badge SITE/BALCÃO etc).
  navigator.serviceWorker.addEventListener("message", (event) => {
    if (event.data?.type !== "RELOAD_REQUIRED") return;
    const key = `sw-reloaded-${event.data.cache || "v"}`;
    try {
      if (sessionStorage.getItem(key)) return;
      sessionStorage.setItem(key, "1");
    } catch {
      // sessionStorage bloqueado: ignora pra não loopar
      return;
    }
    window.location.reload();
  });
} else if ("serviceWorker" in navigator) {
  // Ambiente não-produção: remove SW anterior pra evitar cache preso.
  navigator.serviceWorker.getRegistrations().then((registrations) => {
    registrations.forEach((r) => r.unregister());
  });
}

createRoot(document.getElementById("root")!).render(<App />);
