<script lang="ts">
  import { useConvexClient } from "convex-svelte";
  import { useQuery } from "convex-svelte";
  import { api } from "@sgse-app/backend/convex/_generated/api";
  import { onMount } from "svelte";

  const client = useConvexClient();
  
  // Verificar se o usuário está autenticado antes de gerenciar presença
  const currentUser = useQuery(api.auth.getCurrentUser, {});
  const usuarioAutenticado = $derived(currentUser?.data !== null && currentUser?.data !== undefined);

  // Token é passado automaticamente via interceptadores em +layout.svelte

  let heartbeatInterval: ReturnType<typeof setInterval> | null = null;
  let inactivityTimeout: ReturnType<typeof setTimeout> | null = null;
  let lastActivity = Date.now();

  // Detectar atividade do usuário
  function handleActivity() {
    if (!usuarioAutenticado) return;
    
    lastActivity = Date.now();
    
    // Limpar timeout de inatividade anterior
    if (inactivityTimeout) {
      clearTimeout(inactivityTimeout);
    }

    // Configurar novo timeout (5 minutos)
    inactivityTimeout = setTimeout(() => {
      if (usuarioAutenticado) {
        client.mutation(api.chat.atualizarStatusPresenca, { status: "ausente" });
      }
    }, 5 * 60 * 1000);
  }

  onMount(() => {
    // Só configurar presença se usuário estiver autenticado
    if (!usuarioAutenticado) return;

    // Configurar como online ao montar (apenas se autenticado)
    client.mutation(api.chat.atualizarStatusPresenca, { status: "online" });

    // Heartbeat a cada 30 segundos (apenas se autenticado)
    heartbeatInterval = setInterval(() => {
      if (!usuarioAutenticado) {
        if (heartbeatInterval) {
          clearInterval(heartbeatInterval);
          heartbeatInterval = null;
        }
        return;
      }
      
      const timeSinceLastActivity = Date.now() - lastActivity;
      
      // Se houve atividade nos últimos 5 minutos, manter online
      if (timeSinceLastActivity < 5 * 60 * 1000) {
        client.mutation(api.chat.atualizarStatusPresenca, { status: "online" });
      }
    }, 30 * 1000);

    // Listeners para detectar atividade
    const events = ["mousedown", "keydown", "scroll", "touchstart"];
    events.forEach((event) => {
      window.addEventListener(event, handleActivity);
    });

    // Configurar timeout inicial de inatividade
    if (usuarioAutenticado) {
      handleActivity();
    }

    // Detectar quando a aba fica inativa/ativa
    function handleVisibilityChange() {
      if (!usuarioAutenticado) return;
      
      if (document.hidden) {
        // Aba ficou inativa
        client.mutation(api.chat.atualizarStatusPresenca, { status: "ausente" });
      } else {
        // Aba ficou ativa
        client.mutation(api.chat.atualizarStatusPresenca, { status: "online" });
        handleActivity();
      }
    }

    document.addEventListener("visibilitychange", handleVisibilityChange);

    // Cleanup
    return () => {
      // Marcar como offline ao desmontar (apenas se autenticado)
      if (usuarioAutenticado) {
        client.mutation(api.chat.atualizarStatusPresenca, { status: "offline" });
      }

      if (heartbeatInterval) {
        clearInterval(heartbeatInterval);
      }

      if (inactivityTimeout) {
        clearTimeout(inactivityTimeout);
      }

      events.forEach((event) => {
        window.removeEventListener(event, handleActivity);
      });

      document.removeEventListener("visibilitychange", handleVisibilityChange);
    };
  });
</script>

<!-- Componente invisível - apenas lógica -->
