/*
|--------------------------------------------------------------------------
| Agência PSI
|--------------------------------------------------------------------------
| Criado e desenvolvido por Leonardo Nohama
|
| Tecnologia aplicada à escuta.
| Estrutura para o cuidado.
|
| Arquivo: src/utils/feriadosBR.js
| Data: 2026
| Local: São Carlos/SP — Brasil
|--------------------------------------------------------------------------
| © 2026 — Todos os direitos reservados
|--------------------------------------------------------------------------
*/
// Gera feriados nacionais brasileiros por algoritmo — sem API externa.

/**
 * Calcula a data da Páscoa pelo algoritmo de Meeus/Jones/Butcher.
 * @param {number} ano
 * @returns {Date}
 */
function calcularPascoa(ano) {
    const a = ano % 19;
    const b = Math.floor(ano / 100);
    const c = ano % 100;
    const d = Math.floor(b / 4);
    const e = b % 4;
    const f = Math.floor((b + 8) / 25);
    const g = Math.floor((b - f + 1) / 3);
    const h = (19 * a + b - d - g + 15) % 30;
    const i = Math.floor(c / 4);
    const k = c % 4;
    const l = (32 + 2 * e + 2 * i - h - k) % 7;
    const m = Math.floor((a + 11 * h + 22 * l) / 451);
    const mes = Math.floor((h + l - 7 * m + 114) / 31);
    const dia = ((h + l - 7 * m + 114) % 31) + 1;
    return new Date(ano, mes - 1, dia);
}

function somarDias(data, dias) {
    const d = new Date(data);
    d.setDate(d.getDate() + dias);
    return d;
}

function toISO(data) {
    const y = data.getFullYear();
    const m = String(data.getMonth() + 1).padStart(2, '0');
    const d = String(data.getDate()).padStart(2, '0');
    return `${y}-${m}-${d}`;
}

function feriado(data, nome, movel = false) {
    return { data: toISO(data), nome, movel };
}

/**
 * Retorna todos os feriados nacionais do ano informado.
 * @param {number} ano
 * @returns {{ data: string, nome: string, movel: boolean }[]}
 */
export function getFeriadosNacionais(ano) {
    const pascoa = calcularPascoa(ano);

    const lista = [
        // ── Fixos ───────────────────────────────────────────────
        feriado(new Date(ano, 0, 1), 'Confraternização Universal'),
        feriado(new Date(ano, 3, 21), 'Tiradentes'),
        feriado(new Date(ano, 4, 1), 'Dia do Trabalho'),
        feriado(new Date(ano, 8, 7), 'Independência do Brasil'),
        feriado(new Date(ano, 9, 12), 'Nossa Senhora Aparecida'),
        feriado(new Date(ano, 10, 2), 'Finados'),
        feriado(new Date(ano, 10, 15), 'Proclamação da República'),
        feriado(new Date(ano, 11, 25), 'Natal'),

        // ── Móveis ──────────────────────────────────────────────
        feriado(somarDias(pascoa, -48), 'Segunda de Carnaval', true),
        feriado(somarDias(pascoa, -47), 'Carnaval', true),
        feriado(somarDias(pascoa, -2), 'Sexta-feira Santa', true),
        feriado(pascoa, 'Páscoa', true),
        feriado(somarDias(pascoa, 60), 'Corpus Christi', true)
    ];

    return lista.sort((a, b) => a.data.localeCompare(b.data));
}

/**
 * Retorna feriados nacionais de um mês específico.
 * @param {number} ano
 * @param {number} mes  1–12
 */
export function getFeriadosNacionaisDoMes(ano, mes) {
    const m = String(mes).padStart(2, '0');
    return getFeriadosNacionais(ano).filter((f) => f.data.slice(5, 7) === m);
}
