import { NextResponse } from "next/server";
import { createClient } from "@/lib/supabase-server";
import { canCompany, getCompanyContext } from "@/lib/company-context";

/**
 * Marcar um compromisso como concluido.
 *
 * Rota propria e sem corpo porque e a acao que sai da fila quando o sinal
 * volta: quanto menos ela precisar carregar, menor a chance de falhar de novo
 * numa rede ruim.
 *
 * Concluir duas vezes da o mesmo resultado — a fila pode repetir uma acao se
 * o aparelho desligar entre o envio e a confirmacao.
 */
export async function POST(req: Request, ctx: { params: Promise<{ id: string }> }) {
  const { id } = await ctx.params;
  const supabase = await createClient();
  const {
    data: { user },
  } = await supabase.auth.getUser();
  if (!user) return NextResponse.json({ error: "Nao autenticado." }, { status: 401 });

  const companyCtx = await getCompanyContext(supabase, user);
  if (!canCompany(companyCtx, user.id, "agenda.board.write")) {
    return NextResponse.json({ error: "Sem permissão." }, { status: 403 });
  }

  const { data: existente } = await supabase
    .from("agenda_events")
    .select("id,event_date")
    .eq("id", id)
    .maybeSingle();

  /* 404 tambem tira da fila: compromisso apagado enquanto o aparelho estava
     sem sinal nao deve ficar tentando para sempre. */
  if (!existente) {
    return NextResponse.json({ error: "Compromisso não encontrado." }, { status: 404 });
  }

  /* Nao da pra concluir o que ainda nao aconteceu. A fila offline tambem
     respeita isso: se o aparelho ficou sem sinal e so reconectou depois do
     dia marcado, tudo bem — o problema e concluir um dia que ainda vai
     chegar. */
  const hoje = (() => {
    const d = new Date();
    return `${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, "0")}-${String(d.getDate()).padStart(2, "0")}`;
  })();
  if (String(existente.event_date) > hoje) {
    return NextResponse.json(
      { error: "Esse compromisso ainda não aconteceu — não dá pra concluir antes da data." },
      { status: 400 }
    );
  }

  const { error } = await supabase
    .from("agenda_events")
    .update({ status: "concluido", updated_at: new Date().toISOString() })
    .eq("id", id);

  if (error) return NextResponse.json({ error: "Não foi possível concluir." }, { status: 400 });
  return NextResponse.json({ ok: true });
}
