/**
 * Bridge Inertia → store d'activité réseau.
 *
 * Branche les events globaux du router Inertia sur le store. Couvre
 * automatiquement toute navigation et toute soumission de formulaire, sans
 * aucune modification de page.
 */
import { router } from '@inertiajs/react';
import { isSilentVisit } from './classify-visit';
import { doneTask, startTask } from './loading-store';

/**
 * Enregistre les listeners Inertia. Renvoie une fonction de désinscription
 * (à appeler au démontage / HMR pour éviter les doubles écoutes).
 *
 * Le cycle Inertia garantit que `finish` se déclenche pour chaque visite
 * (succès, erreur 422, exception ET annulation) : on équilibre donc
 * start/finish sans risque de barre coincée, et sans clobber les autres
 * tâches concurrentes (axios/fetch) avec un reset global.
 */
let installed = false;

export function registerInertiaLoading(): () => void {
    if (installed) return () => {};
    installed = true;

    // Suit les visites silencieuses pour équilibrer correctement start/finish.
    const silent = new WeakSet<object>();

    const offStart = router.on('start', (event) => {
        const visit = event.detail.visit;
        if (isSilentVisit(visit)) {
            if (visit && typeof visit === 'object') silent.add(visit as object);
            return;
        }
        startTask();
    });

    const offFinish = router.on('finish', (event) => {
        const visit = event.detail.visit;
        if (visit && typeof visit === 'object' && silent.has(visit as object)) {
            silent.delete(visit as object);
            return;
        }
        doneTask();
    });

    return () => {
        offStart();
        offFinish();
        installed = false;
    };
}
