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

/**
 * Criacao de compromisso da agenda.
 *
 * A gravacao usa o cliente do usuario, e nao o de servico: assim as policies
 * da tabela valem de verdade. Se alguem mandar um company_id que nao e o seu,
 * o banco recusa — a checagem aqui e para dar mensagem decente, nao para ser
 * a unica barreira.
 */

export async function POST(req: Request) {
  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 para criar compromisso." }, { status: 403 });
  }

  const corpo = (await req.json().catch(() => null)) as CorpoCompromisso | null;
  const check = validar(corpo);
  if (!check.ok) return NextResponse.json({ error: check.erro }, { status: 400 });

  /* O dono da empresa, nao o id de quem esta logado: um funcionario criando
     o compromisso nao pode gravar company_id com o proprio id, senao a linha
     nao bate com current_company_id()/current_owner_id() na proxima leitura
     e some da agenda de todo mundo, inclusive de quem criou. */
  const companyId = companyCtx.ownerId ?? user.id;

  const { data: categoria } = await supabase
    .from("agenda_categories")
    .select("id")
    .eq("id", check.dados.category_id)
    .eq("company_id", companyId)
    .eq("is_system", false)
    .maybeSingle();
  if (!categoria) {
    return NextResponse.json({ error: "Categoria inválida." }, { status: 400 });
  }

  /* Sem isso, qualquer id de cliente passava — inclusive um de outra empresa,
     que o RLS da tabela de clientes ja esconde na leitura mas deixaria o
     compromisso vinculado a um registro fantasma. */
  if (check.dados.client_id) {
    const tenantIds = companyCtx.tenantIds?.length ? companyCtx.tenantIds : [user.id];
    const { data: cliente } = await supabase
      .from("clients")
      .select("id")
      .eq("id", check.dados.client_id)
      .in("user_id", tenantIds)
      .maybeSingle();
    if (!cliente) {
      return NextResponse.json({ error: "Cliente inválido." }, { status: 400 });
    }
  }

  const { data, error } = await supabase
    .from("agenda_events")
    .insert({ ...check.dados, company_id: companyId, created_by: user.id, responsible_user_id: user.id })
    .select("id")
    .maybeSingle();

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

  return NextResponse.json({ ok: true, id: data?.id });
}
