"use client";

import { useEffect, useState } from "react";

import { pwaUtil } from "@/utils/pwa";

type PwaInstallResult = Awaited<ReturnType<typeof pwaUtil.install>>;

export function usePwaInstallEntry() {
  const [canInstall, setCanInstall] = useState(false);

  useEffect(() => {
    const updateInstallEntryVisibility = () => {
      setCanInstall(pwaUtil.canShowInstallEntry());
    };

    pwaUtil.prepareInstallPrompt();
    updateInstallEntryVisibility();
    const unsubscribe = pwaUtil.subscribe(updateInstallEntryVisibility);

    return () => {
      unsubscribe();
    };
  }, []);

  const installApp = async () => {
    pwaUtil.prepareInstallPrompt();
    const result = await pwaUtil.install();
    setCanInstall(
      shouldKeepPwaInstallEntryVisible({
        result,
        isInstalled: pwaUtil.isInstalled(),
        canShowInstallEntry: pwaUtil.canShowInstallEntry(),
      }),
    );
  };

  return {
    canInstall,
    installApp,
  };
}

export function shouldKeepPwaInstallEntryVisible({
  result,
  isInstalled,
  canShowInstallEntry,
}: {
  result: PwaInstallResult;
  isInstalled: boolean;
  canShowInstallEntry: boolean;
}): boolean {
  return result !== "accepted" && !isInstalled && canShowInstallEntry;
}
