import { watch } from 'vue';
import { useAuthStore } from '../stores/auth';
import { useSessionsStore } from '../stores/sessions';
import { useWorktreesStore } from '../stores/worktrees';
import { useGroupsStore } from '../stores/groups';
import { useSettingsStore } from '../stores/settings';

/**
 * Propriétaire unique du chargement initial et des abonnements temps réel (sessions, worktrees,
 * groupes, réglages). Monté dans App.vue, il est donc actif quel que soit le layout, y compris
 * la vue IDE plein écran (qui n'a pas d'AppShell). Démarre à l'authentification, s'arrête à la
 * déconnexion. Les stores gardent leurs abonnements par `??=`, donc l'appel est idempotent.
 */
export function useRealtimeBootstrap(): void {
  const auth = useAuthStore();
  const sessions = useSessionsStore();
  const worktrees = useWorktreesStore();
  const groups = useGroupsStore();
  const settings = useSettingsStore();

  let started = false;

  function start(): void {
    if (started) return;
    started = true;
    void worktrees.fetchAll();
    void sessions.fetchSessions();
    void groups.fetchGroups();
    void settings.fetch(); // alimente l'icône de nav Gitea et la vue Réglages
    worktrees.startRealtime();
    sessions.startRealtime();
    groups.startRealtime();
    settings.startRealtime();
  }

  function stop(): void {
    if (!started) return;
    started = false;
    worktrees.stopRealtime();
    sessions.stopRealtime();
    groups.stopRealtime();
    settings.stopRealtime();
  }

  watch(
    () => auth.authenticated,
    (v) => {
      if (v) start();
      else if (v === false) stop();
    },
    { immediate: true },
  );
}
