"use client";

import { useEffect, useRef } from "react";
import { usePathname } from "next/navigation";
import Swal from "sweetalert2";

/**
 * TWA/PWA standalone 또는 모바일 환경에서 안드로이드 뒤로가기 처리.
 * - 더 갈 history 가 없을 때(또는 sentinel entry 일 때) 첫 번째 뒤로가기는 토스트만
 * - 2초 안에 한 번 더 뒤로 누르면 native 가 처리하도록 history.back() → 앱 종료
 * - pathname 이 바뀔 때마다 sentinel 을 새로 push 해서 navigation 후에도 작동
 */
export default function BackButtonGuard() {
  const pathname = usePathname();
  const lastBackRef = useRef(0);

  useEffect(() => {
    const isStandalone =
      window.matchMedia("(display-mode: standalone)").matches ||
      window.matchMedia("(display-mode: fullscreen)").matches ||
      window.matchMedia("(display-mode: minimal-ui)").matches ||
      (window.navigator as Navigator & { standalone?: boolean }).standalone === true;
    const isMobileUA = /Mobile|Android|iPhone|iPad|iPod/i.test(window.navigator.userAgent);
    if (!isStandalone && !isMobileUA) return;

    // pathname 진입(또는 변경) 시마다 sentinel 1 개 push — webview history 의 마지막 자리에 두기 위함
    history.pushState({ __back_guard: true, ts: Date.now() }, "", location.href);

    const onPopState = () => {
      const now = Date.now();
      if (now - lastBackRef.current < 2000) {
        // 2초 이내 두 번째 뒤로 → 진짜 종료 (history.back 으로 native back 트리거)
        history.back();
        return;
      }
      lastBackRef.current = now;

      // sentinel 다시 push
      history.pushState({ __back_guard: true, ts: Date.now() }, "", location.href);

      Swal.fire({
        toast: true,
        position: "bottom",
        showConfirmButton: false,
        timer: 2000,
        timerProgressBar: true,
        icon: "info",
        title: "한 번 더 누르면 앱이 종료됩니다",
        background: "#1f2937",
        color: "#ffffff",
        customClass: { popup: "z-[9999]" },
      });

      setTimeout(() => {
        lastBackRef.current = 0;
      }, 2000);
    };

    window.addEventListener("popstate", onPopState);
    return () => {
      window.removeEventListener("popstate", onPopState);
    };
  }, [pathname]);

  return null;
}
