import { NextResponse } from "next/server";
import { createAdminClient } from "@/lib/supabase-admin";
import { createClient } from "@/lib/supabase-server";
import { isOwnerUser } from "@/lib/owner-auth";

/*
  Moderação dos modelos da comunidade (migration 227): o dono aprova (entra
  na galeria de todas as empresas) ou recusa com o motivo (a empresa vê na
  galeria dela). DELETE apaga de vez (o modelo some da galeria; as cópias
  que as empresas já fizeram continuam com elas).
*/

async function conferirDono() {
  const supabase = await createClient();
  const {
    data: { user },
  } = await supabase.auth.getUser();
  if (!user || !isOwnerUser({ id: user.id, email: user.email })) return { ok: false as const, status: 403, email: "" };
  return { ok: true as const, status: 200, email: user.email || user.id };
}

const texto = (valor: unknown, maximo: number) => (typeof valor === "string" ? valor.replace(/\s+/g, " ").trim().slice(0, maximo) : "");

export async function PATCH(request: Request) {
  const auth = await conferirDono();
  if (!auth.ok) return NextResponse.json({ error: "Sem permissão." }, { status: auth.status });
  const body = (await request.json().catch(() => null)) as Record<string, unknown> | null;
  const id = texto(body?.id, 60);
  const acao = body?.acao;
  if (!id || (acao !== "aprovar" && acao !== "recusar" && acao !== "voltar")) return NextResponse.json({ error: "Pedido inválido." }, { status: 400 });
  const motivo = texto(body?.motivo, 300);
  if (acao === "recusar" && !motivo) return NextResponse.json({ error: "Diga o motivo da recusa (a empresa vai ver)." }, { status: 400 });
  const admin = createAdminClient();
  const payload =
    acao === "voltar"
      ? { status: "pendente", motivo: null, avaliado_em: null, avaliado_por: null }
      : { status: acao === "aprovar" ? "aprovado" : "recusado", motivo: acao === "recusar" ? motivo : null, avaliado_em: new Date().toISOString(), avaliado_por: auth.email };
  const { data, error } = await admin.from("modelos_da_comunidade").update(payload).eq("id", id).select("id,status,motivo,avaliado_em,avaliado_por").maybeSingle();
  if (error) return NextResponse.json({ error: "Não foi possível atualizar o modelo." }, { status: 400 });
  if (!data) return NextResponse.json({ error: "Modelo não encontrado." }, { status: 404 });
  return NextResponse.json({ ok: true, modelo: data });
}

export async function DELETE(request: Request) {
  const auth = await conferirDono();
  if (!auth.ok) return NextResponse.json({ error: "Sem permissão." }, { status: auth.status });
  const id = texto(new URL(request.url).searchParams.get("id"), 60);
  if (!id) return NextResponse.json({ error: "Modelo inválido." }, { status: 400 });
  const admin = createAdminClient();
  const { error } = await admin.from("modelos_da_comunidade").delete().eq("id", id);
  if (error) return NextResponse.json({ error: "Não foi possível apagar o modelo." }, { status: 400 });
  return NextResponse.json({ ok: true });
}
