// src/app/components/SessionActivityMonitor.tsx
"use client";

import { useEffect, useRef } from "react";
import { signOut, useSession } from "next-auth/react";
import { usePathname } from "next/navigation";

export default function SessionActivityMonitor() {
  const { data: session, status } = useSession();
  const pathname = usePathname();
  const lastActivityRef = useRef<number>(Date.now());
  const checkIntervalRef = useRef<NodeJS.Timeout | null>(null);
  const hasCheckedInitial = useRef<boolean>(false);

  const INACTIVITY_TIMEOUT =
    parseInt(process.env.NEXT_PUBLIC_INACTIVITY_TIMEOUT || "30") * 60 * 1000;

  useEffect(() => {
    const publicPaths = ["/login", "/initial-setup"];
    if (publicPaths.some((path) => pathname?.startsWith(path))) {
      return;
    }

    if (status !== "authenticated" || !session) {
      return;
    }

    if (!hasCheckedInitial.current) {
      hasCheckedInitial.current = true;

      const browserSessionActive = sessionStorage.getItem(
        "browser_session_active"
      );
      const lastActivity = localStorage.getItem("last_activity");

      if (!browserSessionActive) {
        if (lastActivity) {
          const timePassed = Date.now() - parseInt(lastActivity);

          if (timePassed >= INACTIVITY_TIMEOUT) {
            localStorage.removeItem("last_activity");
            sessionStorage.clear();
            signOut({ callbackUrl: "/login", redirect: true });
            return;
          }
        }
      }
    }

    sessionStorage.setItem("browser_session_active", "true");

    const updateActivity = () => {
      const now = Date.now();
      lastActivityRef.current = now;
      localStorage.setItem("last_activity", now.toString());
    };

    updateActivity();

    const activityEvents = [
      "mousedown",
      "keypress",
      "scroll",
      "touchstart",
      "mousemove",
    ];

    activityEvents.forEach((event) => {
      document.addEventListener(event, updateActivity, { passive: true });
    });

    checkIntervalRef.current = setInterval(() => {
      const lastActivity = localStorage.getItem("last_activity");

      if (!lastActivity) {
        updateActivity();
        return;
      }

      const inactiveTime = Date.now() - parseInt(lastActivity);
      const minutosInactivo = Math.floor(inactiveTime / 60000);

      if (inactiveTime >= INACTIVITY_TIMEOUT) {
        localStorage.removeItem("last_activity");
        sessionStorage.clear();
        signOut({ callbackUrl: "/login", redirect: true });
      }
    }, 30000);

    const handleVisibilityChange = () => {
      if (document.visibilityState === "visible") {
        const lastActivity = localStorage.getItem("last_activity");

        if (lastActivity) {
          const timePassed = Date.now() - parseInt(lastActivity);

          if (timePassed >= INACTIVITY_TIMEOUT) {
            localStorage.removeItem("last_activity");
            sessionStorage.clear();
            signOut({ callbackUrl: "/login", redirect: true });
            return;
          }
        }

        updateActivity();
      }
    };

    document.addEventListener("visibilitychange", handleVisibilityChange);

    return () => {
      activityEvents.forEach((event) => {
        document.removeEventListener(event, updateActivity);
      });

      if (checkIntervalRef.current) {
        clearInterval(checkIntervalRef.current);
      }

      document.removeEventListener("visibilitychange", handleVisibilityChange);
    };
  }, [session, status, INACTIVITY_TIMEOUT, pathname]);

  return null;
}
