import { useEffect, useState } from 'react';

type PromptEvent = Event & {
  prompt: () => Promise<void>;
  userChoice: Promise<{ outcome: string }>;
};

declare global {
  interface Window {
    __gxInstall?: PromptEvent | null;
  }
}

/**
 * Maneja la instalacion del PWA:
 * - `instalable` + `instalar()` cuando el navegador ofrece instalar (Android/Chrome).
 * - `esIOS` para mostrar la instruccion manual en iPhone (Safari no dispara el evento).
 * - `instalado` si ya esta corriendo como app instalada.
 * El evento `beforeinstallprompt` se captura temprano en index.html (window.__gxInstall)
 * porque el navegador puede dispararlo antes de que React monte.
 */
export function useInstalarPWA() {
  const [evento, setEvento] = useState<PromptEvent | null>(() => window.__gxInstall ?? null);
  const [instalado, setInstalado] = useState(false);

  useEffect(() => {
    const standalone =
      window.matchMedia('(display-mode: standalone)').matches ||
      (navigator as unknown as { standalone?: boolean }).standalone === true;
    if (standalone) setInstalado(true);
    if (window.__gxInstall) setEvento(window.__gxInstall);

    const onPrompt = (e: Event) => {
      e.preventDefault();
      window.__gxInstall = e as PromptEvent;
      setEvento(e as PromptEvent);
    };
    const onCapturado = () => {
      if (window.__gxInstall) setEvento(window.__gxInstall);
    };
    const onInstalado = () => {
      setInstalado(true);
      setEvento(null);
      window.__gxInstall = null;
    };
    window.addEventListener('beforeinstallprompt', onPrompt);
    window.addEventListener('gx-installable', onCapturado);
    window.addEventListener('appinstalled', onInstalado);
    return () => {
      window.removeEventListener('beforeinstallprompt', onPrompt);
      window.removeEventListener('gx-installable', onCapturado);
      window.removeEventListener('appinstalled', onInstalado);
    };
  }, []);

  const ua = navigator.userAgent || '';
  const esIOS =
    /iphone|ipad|ipod/i.test(ua) && !(navigator as unknown as { standalone?: boolean }).standalone;

  async function instalar() {
    const ev = evento ?? window.__gxInstall;
    if (!ev) return;
    await ev.prompt();
    await ev.userChoice;
    setEvento(null);
    window.__gxInstall = null;
  }

  return { instalable: !!evento, instalar, instalado, esIOS };
}
