/**
 * Remarcar um compromisso: as regras da rota /api/agenda/events/[id]/remarcar,
 * fora dela para o assistente usar as mesmas. Não grava nada; devolve o que
 * mudar no compromisso, ou o erro para mostrar.
 */

export type CompromissoARemarcar = {
  status: string | null;
  recurrence: string | null;
  recurrence_until: string | null;
  start_time: string | null;
  end_time: string | null;
};

export function mudancasDaRemarcacao(
  atual: CompromissoARemarcar,
  params: { dia: string; hoje: string; inicioNovo: string | null }
): { ok: true; mudancas: Record<string, unknown> } | { ok: false; erro: string } {
  const { dia, hoje, inicioNovo } = params;

  /* Mesma regra de coerencia da criacao: arrastar um compromisso agendado
     para tras da data de hoje o deixaria contradizendo a propria situacao. */
  if (atual.status === "agendado" && dia < hoje) {
    return { ok: false, erro: "Esse dia já passou. Compromisso agendado não pode ir para o passado." };
  }

  /* Arrastar move a serie inteira, entao a data final nao pode ficar para
     tras do novo comeco — a repeticao sumiria sem aviso. */
  if (atual.recurrence !== "none" && atual.recurrence_until && String(atual.recurrence_until) < dia) {
    return { ok: false, erro: "Esse compromisso se repete até uma data anterior. Ajuste a repetição antes de mover." };
  }

  const mudancas: Record<string, unknown> = {
    event_date: dia,
    updated_at: new Date().toISOString(),
  };

  if (inicioNovo !== null) {
    const inicioAntigo = String(atual.start_time ?? "");
    mudancas.start_time = inicioNovo;

    /* Move o fim junto, preservando a duracao: arrastar um compromisso de uma
       hora para outra nao deveria encurta-lo nem estica-lo. */
    if (atual.end_time && inicioAntigo) {
      const emMinutos = (t: string) => Number(t.slice(0, 2)) * 60 + Number(t.slice(3, 5));
      const duracao = emMinutos(String(atual.end_time)) - emMinutos(inicioAntigo);
      if (duracao > 0) {
        const fim = emMinutos(inicioNovo) + duracao;
        if (fim < 24 * 60) {
          mudancas.end_time = `${String(Math.floor(fim / 60)).padStart(2, "0")}:${String(fim % 60).padStart(2, "0")}`;
        }
      }
    }
  }

  return { ok: true, mudancas };
}
