/**
 * Projet                    : MageStock
 * Logiciel                  : MageStock
 * Fichier                   : assets/js/password-recovery.js
 * Rôle                      : Validation visuelle de la politique de mot de passe sur la page de récupération.
 * Auteur                    : Régis KREMER
 * Version du fichier        : 1.0.0
 * Version générale          : 2.6.119
 * Lot                       : MAGESTOCK CONNEXION RECUPERATION JETON ADMIN1
 * Base requise              : MageStock 2.6.118
 * Création                  : 2026-07-25
 * Dernière modification     : 2026-07-25
 * Dépendances               : DOM de password-recovery.php
 * Données touchées          : aucune
 * Permissions               : aucune
 * Sécurité                  : aucune conservation du jeton ou du mot de passe dans le navigateur
 * Compatibilité             : navigateurs modernes avec Unicode property escapes
 *
 * Résumé :
 * - Affiche les critères satisfaits sans remplacer la validation serveur.
 * - Bloque uniquement la soumission manifestement incomplète côté client.
 *
 * Historique :
 * - 2.6.119 — Création de la validation interactive.
 */
(function passwordRecoveryValidation(){
    'use strict';

    const form = document.getElementById('passwordRecoveryForm');
    const password = document.getElementById('recoveryPassword');
    const confirm = document.getElementById('recoveryPasswordConfirm');
    const submit = document.getElementById('recoverySubmit');
    const status = document.getElementById('passwordPolicyStatus');
    if(!form || !password || !confirm || !submit) return;

    const rules = {
        length: (value) => [...value].length >= 14 && [...value].length <= 255,
        lowercase: (value) => /\p{Ll}/u.test(value),
        uppercase: (value) => /\p{Lu}/u.test(value),
        number: (value) => /\p{N}/u.test(value),
        symbol: (value) => /[\p{P}\p{S}]/u.test(value),
        identityFree: (value) => !value.toLocaleLowerCase().includes('magestock')
    };

    function evaluate(){
        const value = password.value;
        let valid = value.length > 0;
        Object.entries(rules).forEach(([key, validator]) => {
            const item = document.querySelector(`[data-policy-rule="${key}"]`);
            const result = validator(value);
            valid = valid && result;
            item?.classList.toggle('is-valid', result);
            item?.classList.toggle('is-invalid', value.length > 0 && !result);
        });
        const matches = value.length > 0 && value === confirm.value;
        const matchItem = document.querySelector('[data-policy-rule="matches"]');
        matchItem?.classList.toggle('is-valid', matches);
        matchItem?.classList.toggle('is-invalid', confirm.value.length > 0 && !matches);
        valid = valid && matches;
        password.setAttribute('aria-invalid', value.length > 0 && !Object.values(rules).every((validator) => validator(value)) ? 'true' : 'false');
        confirm.setAttribute('aria-invalid', confirm.value.length > 0 && !matches ? 'true' : 'false');
        submit.disabled = !valid;
        if(status){
            status.textContent = valid
                ? (status.dataset.validText || 'Tous les critères sont satisfaits.')
                : (status.dataset.pendingText || 'Saisissez un mot de passe pour vérifier les critères.');
        }
        return valid;
    }

    password.addEventListener('input', evaluate);
    confirm.addEventListener('input', evaluate);
    form.addEventListener('submit', (event) => {
        if(!evaluate()){
            event.preventDefault();
            (password.value ? confirm : password).focus();
        }
    });
    evaluate();
})();
