/**
 * Bridge axios → store d'activité réseau.
 *
 * Toutes les pages importent l'instance axios par défaut (`import axios from
 * 'axios'`). Un seul couple d'intercepteurs couvre donc automatiquement chaque
 * appel axios de l'app, sans modification de page.
 *
 * Opt-out : `axios.get(url, { meta: { silent: true } })` n'alimente pas la barre
 * (utile pour un éventuel polling en axios).
 */
import axios from 'axios';
import { doneTask, startTask } from './loading-store';

// Permet l'option `meta.silent` typée aux points d'appel.
declare module 'axios' {
    export interface AxiosRequestConfig {
        meta?: { silent?: boolean };
    }
}

let installed = false;

export function registerAxiosLoading(): void {
    if (installed) return;
    installed = true;

    // Suivi par identité de config pour équilibrer start/finish de façon fiable.
    const tracked = new WeakSet<object>();

    axios.interceptors.request.use(
        (config) => {
            if (!config.meta?.silent) {
                tracked.add(config);
                startTask();
            }
            return config;
        },
        (error) => Promise.reject(error),
    );

    axios.interceptors.response.use(
        (response) => {
            if (response.config && tracked.has(response.config)) {
                tracked.delete(response.config);
                doneTask();
            }
            return response;
        },
        (error) => {
            const config = error?.config;
            if (config && tracked.has(config)) {
                tracked.delete(config);
                doneTask();
            }
            return Promise.reject(error);
        },
    );
}
