// BANNER "INSTALAR APP".
//
// En Android/Chrome el navegador nos deja disparar el instalador nosotros
// mismos (evento beforeinstallprompt, que index.html captura desde el <head>).
// En iPhone NO existe ese evento: Safari solo permite instalar a mano desde
// Compartir → "Agregar a inicio", así que ahí el banner explica el camino.
//
// Se monta solo (no hay que tocar app.jsx) y no aparece si:
//   - ya está corriendo como app instalada,
//   - el usuario ya lo cerró antes,
//   - el navegador no puede instalar (escritorio sin soporte, etc).
//
// Sufijo IP en todo — los .jsx del proto comparten scope global.

const IP_DISMISS_KEY = "trooper_install_dismissed_v1";

function isStandaloneIP() {
  try {
    if (window.matchMedia && window.matchMedia("(display-mode: standalone)").matches) return true;
    if (window.navigator.standalone === true) return true;   // iOS
  } catch (e) {}
  return false;
}

function isIosIP() {
  const ua = navigator.userAgent || "";
  const iOSClassic = /iPad|iPhone|iPod/.test(ua);
  // iPadOS moderno se anuncia como Mac; se delata por el touch.
  const iPadOS = /Macintosh/.test(ua) && navigator.maxTouchPoints > 1;
  return iOSClassic || iPadOS;
}

function wasDismissedIP() {
  try { return localStorage.getItem(IP_DISMISS_KEY) === "1"; } catch (e) { return false; }
}

function InstallBannerIP() {
  const [canPrompt, setCanPrompt] = React.useState(!!window.__deferredInstallPrompt);
  const [closed, setClosed] = React.useState(() => wasDismissedIP());
  const [installed, setInstalled] = React.useState(false);

  React.useEffect(() => {
    const onInstallable = () => setCanPrompt(true);
    const onInstalled = () => setInstalled(true);
    window.addEventListener("trooper:installable", onInstallable);
    window.addEventListener("trooper:installed", onInstalled);
    return () => {
      window.removeEventListener("trooper:installable", onInstallable);
      window.removeEventListener("trooper:installed", onInstalled);
    };
  }, []);

  const ios = isIosIP();
  const standalone = isStandaloneIP();

  if (installed || standalone || closed) return null;
  // Android/escritorio: solo si el navegador ya dijo que se puede instalar.
  // iPhone: siempre (no hay evento que esperar), pero solo en Safari-like.
  if (!canPrompt && !ios) return null;

  const dismiss = () => {
    setClosed(true);
    try { localStorage.setItem(IP_DISMISS_KEY, "1"); } catch (e) {}
  };

  const install = async () => {
    const ev = window.__deferredInstallPrompt;
    if (!ev) return;
    try {
      ev.prompt();
      await ev.userChoice;
    } catch (e) {
      console.warn("[pwa] prompt falló", e);
    }
    window.__deferredInstallPrompt = null;
    setCanPrompt(false);
  };

  return (
    <div className="pwa-banner" role="dialog" aria-label="Instalar TROOPER">
      <img className="pwa-banner-icon" src="/icon-192.png" alt="" width="38" height="38" />
      <div className="pwa-banner-text">
        <div className="pwa-banner-title">INSTALAR TROOPER</div>
        <div className="pwa-banner-sub">
          {ios
            ? "Toca Compartir y luego “Agregar a inicio”."
            : "Ábrela como app, sin navegador."}
        </div>
      </div>
      {!ios && (
        <button type="button" className="pwa-banner-btn" onClick={install}>
          INSTALAR
        </button>
      )}
      <button type="button" className="pwa-banner-x" onClick={dismiss} aria-label="Cerrar">✕</button>
    </div>
  );
}

// Auto-montaje: así funciona en cualquier vista (sala, lector móvil, editor)
// sin tener que meter el componente en el árbol de app.jsx.
(function mountInstallBannerIP() {
  if (window.__installBannerMounted) return;
  window.__installBannerMounted = true;
  const el = document.createElement("div");
  el.id = "install-banner-root";
  document.body.appendChild(el);
  ReactDOM.createRoot(el).render(React.createElement(InstallBannerIP));
})();

window.InstallBanner = InstallBannerIP;
