import { ref } from 'vue';

/**
 * Écran d'intro affiché UNIQUEMENT après une connexion validée par la base,
 * et qui dure tout le temps du chargement du dashboard qui suit.
 *
 *   - `show()` → à appeler seulement quand les identifiants sont confirmés
 *               corrects (voir `attemptLogin`), juste avant de naviguer vers
 *               le dashboard.
 *   - `hide()` → à appeler quand ce chargement est terminé. Respecte une durée
 *               minimale pour laisser l'animation d'intro se dérouler.
 *
 * L'état est un singleton (niveau module) pour survivre à la navigation
 * Inertia : le formulaire est démonté sans interrompre l'animation.
 */
const visible = ref(false);

// Durée minimale d'affichage, le temps que l'animation « reveal » du logo
// (tracé ~1.15 s + apparition du corps ~1.4 s) se déroule proprement avant
// que l'écran ne se referme en fondu.
const MIN_VISIBLE_MS = 1600;

let hideTimer: ReturnType<typeof setTimeout> | null = null;
let shownAt = 0;

function clearHideTimer(): void {
    if (hideTimer) {
        clearTimeout(hideTimer);
        hideTimer = null;
    }
}

export function useLoginAnimation() {
    function show(): void {
        clearHideTimer();
        visible.value = true;
        shownAt = Date.now();
    }

    function hide(): void {
        const remaining = Math.max(0, MIN_VISIBLE_MS - (Date.now() - shownAt));
        clearHideTimer();
        hideTimer = setTimeout(() => {
            visible.value = false;
            hideTimer = null;
        }, remaining);
    }

    return { visible, show, hide };
}
