import type { OngletFichier } from './types';

/**
 * Le dernier choix d'onglets, retenu par fichier dans le navigateur.
 *
 * Une commodité, rien de plus : le stockage peut être absent (navigation
 * privée, site bloqué) ou lever à l'accès. Chaque lecture et chaque écriture
 * est donc gardée, et l'écran fonctionne sans — on recoche simplement.
 */

/** Le sous-ensemble de `Storage` utilisé — injectable pour les tests. */
export type StockageCle = Pick<Storage, 'getItem' | 'setItem'>;

const PREFIXE = 'retenue.import-fichier.onglets.';

/** Le stockage du navigateur, ou `null` quand il est inaccessible. */
export function stockageNavigateur(): StockageCle | null {
    try {
        return typeof window !== 'undefined' && window.localStorage ? window.localStorage : null;
    } catch {
        return null;
    }
}

/** Les `gid` mémorisés pour ce fichier — `null` si rien (ou illisible). */
export function lireOngletsMemorises(stockage: StockageCle | null, fichierId: string): number[] | null {
    if (!stockage) return null;

    try {
        const brut = stockage.getItem(PREFIXE + fichierId);
        if (brut === null) return null;

        const valeur: unknown = JSON.parse(brut);
        if (!Array.isArray(valeur)) return null;

        return valeur.filter((gid): gid is number => typeof gid === 'number' && Number.isInteger(gid));
    } catch {
        return null;
    }
}

export function memoriserOnglets(stockage: StockageCle | null, fichierId: string, gids: readonly number[]): void {
    if (!stockage) return;

    try {
        stockage.setItem(PREFIXE + fichierId, JSON.stringify([...gids]));
    } catch {
        // Stockage plein ou refusé : le choix ne sera simplement pas retenu.
    }
}

/**
 * La sélection de départ : ce qui avait été choisi, restreint aux onglets que
 * le serveur sait lire AUJOURD'HUI (un onglet renommé ou devenu illisible ne
 * se recoche pas tout seul). Rien de mémorisé : rien de coché — le mois se
 * choisit, il ne se devine pas.
 */
export function selectionInitiale(onglets: readonly OngletFichier[], memorises: readonly number[] | null): Set<number> {
    if (!memorises) return new Set();

    const lisibles = new Set(onglets.filter((o) => o.reconnu).map((o) => o.gid));

    return new Set(memorises.filter((gid) => lisibles.has(gid)));
}
