import { NextResponse } from "next/server";

import { canCompany, type CompanyPermission } from "@/lib/company-context";
import { acessoDoPainel, pedidoDaPropriaTela, RECUSA_DE_ORIGEM, recusaDoPainel } from "@/lib/assistentes/painel";
import { aplicarDesfazer, prepararDesfazer } from "@/lib/assistentes/personalizacoes/servidor";
import { createClient } from "@/lib/supabase-server";

export const runtime = "nodejs";

const SO_NUMERO = /^[1-9]\d{0,9}$/;

/**
 * Desfaz uma personalização feita por assistente: a configuração volta ao que
 * era antes. Grava com a sessão da pessoa, então as travas do banco valem como
 * na tela da própria configuração.
 */
export async function POST(request: Request, contexto: { params: Promise<{ id: string }> }) {
  if (!pedidoDaPropriaTela(request)) return RECUSA_DE_ORIGEM();
  const acesso = await acessoDoPainel();
  if (!acesso.ok) return recusaDoPainel(acesso.motivo);

  const { id } = await contexto.params;
  if (!SO_NUMERO.test(id)) return NextResponse.json({ error: "Personalização inválida." }, { status: 400 });

  const supabase = await createClient();
  const quem = {
    id: Number(id),
    companyId: acesso.empresa.companyId,
    usuarioId: acesso.user.id,
    verTodas: acesso.verTodas,
    pode: (permissao: CompanyPermission) => canCompany(acesso.empresa, acesso.user.id, permissao),
  };

  try {
    const preparo = await prepararDesfazer(acesso.admin, supabase, quem);
    if (!preparo.ok) return NextResponse.json({ error: preparo.mensagem }, { status: 409 });
    const feito = await aplicarDesfazer(acesso.admin, supabase, preparo, { usuarioId: acesso.user.id });
    if (!feito.ok) return NextResponse.json({ error: feito.mensagem }, { status: 409 });
    return NextResponse.json({ ok: true }, { headers: { "Cache-Control": "no-store" } });
  } catch (erro) {
    console.error("[assistentes] não foi possível desfazer a personalização:", erro instanceof Error ? erro.message : erro);
    return NextResponse.json({ error: "Não foi possível desfazer agora. Tente de novo." }, { status: 500 });
  }
}
