import dayjs from "dayjs" import type { CelulaCalendario, EntradaDataHora } from "./useDataHora" /** * Gera as 42 células (6 semanas) do calendário para o mês de referência. * Preenche dias do mês anterior, atual e posterior para alinhar a grade. */ export function gerarCelulas( referencia: dayjs.Dayjs, diaSelecionado: dayjs.Dayjs | null, min?: string, max?: string, ): CelulaCalendario[] { const inicio = referencia.startOf("month") const fim = referencia.endOf("month") const hoje = dayjs() const minDt = min ? dayjs(min).startOf("day") : null const maxDt = max ? dayjs(max).startOf("day") : null const lista: CelulaCalendario[] = [] for (let i = inicio.day() - 1; i >= 0; i--) { const d = inicio.subtract(i + 1, "day") lista.push({ dia: d.date(), data: d, atual: false, hoje: false, selecionado: false, desabilitado: true, }) } for (let d = inicio; d.isBefore(fim) || d.isSame(fim, "day"); d = d.add(1, "day")) { lista.push({ dia: d.date(), data: d, atual: true, hoje: d.isSame(hoje, "day"), selecionado: diaSelecionado !== null && d.isSame(diaSelecionado, "day"), desabilitado: (minDt !== null && d.isBefore(minDt)) || (maxDt !== null && d.isAfter(maxDt)), }) } let extra = 1 while (lista.length < 42) { const d = fim.add(extra++, "day") lista.push({ dia: d.date(), data: d, atual: false, hoje: false, selecionado: false, desabilitado: true, }) } return lista } /** * Formata um valor ISO para exibição no campo. * @param valor - string ISO 8601 ou null * @param modo - "data" exibe apenas a data, "dataHora" inclui hora */ export function formatarValor( valor: string | null, modo: EntradaDataHora["opcoes"]["modo"], ): string { if (!valor) return "" return modo === "data" ? dayjs(valor).format("DD/MM/YYYY") : dayjs(valor).format("DD/MM/YYYY HH:mm") }