import { NextResponse } from "next/server";

import { lerEscopos, lerNome, lerValidade, MAXIMO_DE_CHAVES_ATIVAS } from "@/lib/assistentes/chave";
import { acessoDoPainel, criarChave, enderecoDoMcp, listarChaves, pedidoDaPropriaTela, RECUSA_DE_ORIGEM, recusaDoPainel } from "@/lib/assistentes/painel";

export const runtime = "nodejs";

const SEM_CACHE = { "Cache-Control": "no-store" };

/**
 * As chaves de acesso dos assistentes e apps, para a aba de Integrações.
 *
 * O GET também diz se a empresa já pode usar o recurso e se a pessoa tem a
 * permissão: é por ele que a tela decide se a aba aparece.
 */
export async function GET(request: Request) {
  const acesso = await acessoDoPainel();
  if (!acesso.ok) {
    if (acesso.motivo === "nao_autenticado") return recusaDoPainel(acesso.motivo);
    return NextResponse.json({ liberado: acesso.motivo !== "nao_liberado", pode: false }, { headers: SEM_CACHE });
  }

  try {
    const chaves = await listarChaves(acesso);
    return NextResponse.json(
      {
        liberado: true,
        pode: true,
        verTodas: acesso.verTodas,
        endereco: enderecoDoMcp(request),
        maximo: MAXIMO_DE_CHAVES_ATIVAS,
        chaves,
      },
      { headers: SEM_CACHE }
    );
  } catch (erro) {
    console.error("[assistentes] não foi possível listar as chaves:", erro instanceof Error ? erro.message : erro);
    return NextResponse.json({ error: "Não foi possível carregar as chaves." }, { status: 500 });
  }
}

/** Cria uma chave. É a única vez em que a chave inteira sai do servidor. */
export async function POST(request: Request) {
  if (!pedidoDaPropriaTela(request)) return RECUSA_DE_ORIGEM();
  const acesso = await acessoDoPainel();
  if (!acesso.ok) return recusaDoPainel(acesso.motivo);

  const corpo = (await request.json().catch(() => null)) as { nome?: unknown; acesso?: unknown; validade?: unknown } | null;

  const nome = lerNome(corpo?.nome);
  if (!nome.ok) return NextResponse.json({ error: nome.erro }, { status: 400 });

  const escopos = lerEscopos(corpo?.acesso);
  if (!escopos) return NextResponse.json({ error: "Escolha o que a chave pode fazer." }, { status: 400 });

  const validade = lerValidade(corpo?.validade);
  if (!validade.ok) return NextResponse.json({ error: validade.erro }, { status: 400 });

  const criada = await criarChave(acesso, { nome: nome.nome, escopos, expiraEm: validade.expiraEm });
  if (!criada.ok) return NextResponse.json({ error: criada.erro }, { status: 400 });

  return NextResponse.json(
    { chave: criada.chave, registro: criada.registro, endereco: enderecoDoMcp(request) },
    { status: 201, headers: SEM_CACHE }
  );
}
