/**
 * Bornes d'années du calendrier (listes déroulantes mois / année — TL-267).
 *
 * react-day-picker v8 n'affiche la liste des ANNÉES que si `fromDate` ET
 * `toDate` sont tous les deux connus : s'il en manque une, `YearsDropdown`
 * rend un fragment vide — le calendrier retombe silencieusement sur les
 * flèches, sans erreur. Il faut donc toujours résoudre les deux bornes, en
 * complétant celle que l'appelant n'a pas fournie.
 */

export interface YearRangeInput {
    /** Borne basse déjà posée par l'appelant (ex. `min` d'un FrDateInput). */
    fromDate?: Date;
    /** Borne haute déjà posée par l'appelant. */
    toDate?: Date;
    fromYear?: number;
    toYear?: number;
    /** Injectable pour les tests ; défaut = maintenant. */
    today?: Date;
}

export interface YearRange {
    fromYear: number;
    toYear: number;
}

/**
 * Années proposées de part et d'autre quand l'appelant ne borne rien.
 *
 * Large volontairement : `fromDate`/`toDate` ne bornent pas seulement la LISTE
 * des années, ils interdisent aussi la sélection et la navigation au-delà. Une
 * fenêtre étroite rendrait donc silencieusement inatteignables des dates
 * légitimes (licence expirant dans 12 ans, pièce d'identité, date de
 * naissance) — sans erreur, juste une flèche qui ne réagit plus. Un `select`
 * natif encaisse sans peine 120 entrées et s'ouvre sur l'année courante.
 */
export const YEARS_BACK = 100;
export const YEARS_AHEAD = 20;

export function resolveYearRange({ fromDate, toDate, fromYear, toYear, today = new Date() }: YearRangeInput = {}): YearRange {
    const base = today.getFullYear();
    const low = fromYear ?? fromDate?.getFullYear();
    const high = toYear ?? toDate?.getFullYear();

    // Les deux bornes viennent de l'appelant : on les respecte, remises dans
    // l'ordre (une plage inversée viderait la liste).
    if (low !== undefined && high !== undefined) {
        return { fromYear: Math.min(low, high), toYear: Math.max(low, high) };
    }

    // Une seule borne : l'autre s'étend depuis aujourd'hui, sans jamais
    // produire une plage vide (cas d'un `max` situé dans le passé).
    if (low !== undefined) {
        return { fromYear: low, toYear: Math.max(low, base + YEARS_AHEAD) };
    }
    if (high !== undefined) {
        return { fromYear: Math.min(high, base - YEARS_BACK), toYear: high };
    }

    return { fromYear: base - YEARS_BACK, toYear: base + YEARS_AHEAD };
}
