import type { ProposalStatus, ProposalSummary } from "@/lib/mock/types";

/** Status válidos persistidos manualmente (vencida é sempre calculada). */
export type ManualProposalStatus = "rascunho" | "enviada" | "aprovada";

const MANUAL_STATUSES: ManualProposalStatus[] = [
  "rascunho",
  "enviada",
  "aprovada",
];

/**
 * Normaliza um status desconhecido/legacy para um valor seguro.
 * Status "expirada" salvo na store é tratado como rascunho — vencimento
 * passa a ser calculado dinamicamente pela validade.
 */
export function normalizeStatus(status: unknown): ManualProposalStatus {
  if (typeof status === "string" && (MANUAL_STATUSES as string[]).includes(status)) {
    return status as ManualProposalStatus;
  }
  return "rascunho";
}

/** True se a data de validade já passou (final do dia). */
export function isExpired(p: Pick<ProposalSummary, "validUntil">): boolean {
  return new Date(p.validUntil + "T23:59:59") < new Date();
}

/**
 * Status efetivo da proposta:
 * - "aprovada" sempre tem prioridade (mesmo após vencimento).
 * - Caso contrário, se a validade passou, retorna "expirada" (rótulo "vencida").
 * - Caso contrário, retorna o status normalizado salvo.
 */
export function getEffectiveStatus(
  p: Pick<ProposalSummary, "status" | "validUntil">,
): ProposalStatus {
  const normalized = normalizeLegacyStatus(p.status);
  if (normalized === "aprovada") return "aprovada";
  if (isExpired(p)) return "expirada";
  return normalized;
}

/**
 * Aceita os status atuais da store (incluindo "expirada" legado) e devolve
 * o status manual subjacente — útil ao renderizar selects de alteração manual.
 */
export function normalizeLegacyStatus(status: ProposalStatus): ManualProposalStatus {
  if (status === "expirada") return "rascunho";
  return status;
}
