import { NextResponse } from "next/server";

import { catalogoPublico } from "@/lib/paineis/metricas";
import { contextoDaRota, exigirEdicao, respostaDeErro } from "@/lib/paineis/rota";
import { alterarPainel, buscarPainel, calcularWidgets, excluirPainel } from "@/lib/paineis/servidor";

type Contexto = { params: Promise<{ id: string }> };

/* O painel com os números de cada quadro já calculados. */
export async function GET(_req: Request, { params }: Contexto) {
  try {
    const { id } = await params;
    const { supabase, empresaId, podeEditar, fonte } = await contextoDaRota();
    const painel = await buscarPainel(supabase, empresaId, id);
    const dados = await calcularWidgets(fonte(), painel.widgets);
    return NextResponse.json({ painel, dados, podeEditar, metricas: catalogoPublico() });
  } catch (erro) {
    return respostaDeErro(erro);
  }
}

/* Muda nome, descrição, quadros ou posição. Devolve o painel recalculado. */
export async function PATCH(req: Request, { params }: Contexto) {
  try {
    const { id } = await params;
    const { supabase, empresaId, podeEditar, fonte } = await contextoDaRota();
    exigirEdicao(podeEditar);
    const corpo = ((await req.json().catch(() => null)) ?? {}) as Record<string, unknown>;
    const painel = await alterarPainel(supabase, empresaId, id, {
      nome: corpo.nome,
      descricao: corpo.descricao,
      widgets: corpo.widgets,
      posicao: corpo.posicao,
    });
    const dados = await calcularWidgets(fonte(), painel.widgets);
    return NextResponse.json({ painel, dados, podeEditar });
  } catch (erro) {
    return respostaDeErro(erro);
  }
}

export async function DELETE(_req: Request, { params }: Contexto) {
  try {
    const { id } = await params;
    const { supabase, empresaId, podeEditar } = await contextoDaRota();
    exigirEdicao(podeEditar);
    await excluirPainel(supabase, empresaId, id);
    return NextResponse.json({ ok: true });
  } catch (erro) {
    return respostaDeErro(erro);
  }
}
