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

function toMinutes(hhmm) {
    const [h, m] = String(hhmm).slice(0, 5).split(':').map(Number);
    return h * 60 + m;
}
function toHHMM(min) {
    const h = Math.floor(min / 60);
    const m = min % 60;
    return `${String(h).padStart(2, '0')}:${String(m).padStart(2, '0')}`;
}

/**
 * Gera lista de horários (HH:MM) a partir:
 * - janelas: [{hora_inicio:'08:00', hora_fim:'12:00', ativo:true}]
 * - regra: {passo_minutos:60, offset_minutos:30, ativo:true}
 *
 * Retorna horários de INÍCIO (igual Altegio)
 */
export function gerarSlotsDoDia(janelas, regra) {
    const passo = Number(regra?.passo_minutos || 60);
    const offset = Number(regra?.offset_minutos || 0);

    const ativos = (janelas || []).filter((j) => j?.ativo !== false);

    const out = [];

    for (const j of ativos) {
        const start = toMinutes(j.hora_inicio);
        const end = toMinutes(j.hora_fim);

        // encontra o primeiro t >= start que respeita offset
        // condição: t % passo == offset (mod passo), mas offset é dentro da hora.
        // Implementação simples: alinhar pelo minuto do dia:
        // alvo: t ≡ offset (mod passo) quando offset é interpretado no ciclo do passo.
        // Para seu uso (passo 60, offset 30), funciona perfeito.
        let t = start;
        const mod = ((t % passo) + passo) % passo;
        const need = (offset - mod + passo) % passo;
        t = t + need;

        while (t + 1 <= end) {
            // só inclui se dentro do intervalo
            if (t >= start && t < end) out.push(toHHMM(t));
            t += passo;
        }
    }

    // unique + sort
    return Array.from(new Set(out)).sort();
}
