import { temMarca } from "@/lib/assistentes/chave";
import { credenciaisDoPrograma, json, lerCampos, recusaOAuth, respostaAoPreflight } from "@/lib/assistentes/oauth/http";
import { identidadeDoPrograma } from "@/lib/assistentes/oauth/pedido";
import { buscarPrograma, desligarPelaFicha, programaConfere, segredoDasFichas } from "@/lib/assistentes/oauth/servidor";
import { createAdminClient } from "@/lib/supabase-server";

export const runtime = "nodejs";
export const dynamic = "force-dynamic";

/**
 * O programa avisa que não vai mais usar a conexão (a pessoa removeu o
 * conector no assistente). A conexão é desligada aqui também.
 *
 * A resposta é a mesma existindo a conexão ou não: quem pergunta não descobre
 * nada sobre o que há guardado. E o que chega sem a marca do servidor recebe
 * essa mesma resposta sem que o banco seja consultado.
 */
export async function POST(request: Request) {
  const campos = await lerCampos(request);
  if (!campos) return recusaOAuth(request, 400, "invalid_request", "O pedido precisa ser um formulario de ate 32 KB.");

  if (typeof campos.token !== "string" || campos.token.length > 100 || !temMarca(segredoDasFichas(), campos.token)) return json(request, {});

  const credenciais = credenciaisDoPrograma(request, campos);
  const identidade = identidadeDoPrograma(credenciais.clientId);
  const admin = createAdminClient();
  const programa = identidade ? await buscarPrograma(admin, identidade) : null;
  if (!programa || !programaConfere(programa, credenciais.segredo)) {
    return recusaOAuth(request, 401, "invalid_client", "Programa desconhecido ou segredo incorreto.");
  }

  await desligarPelaFicha(admin, { ficha: campos.token, programa });
  return json(request, {});
}

export function OPTIONS(request: Request) {
  return respostaAoPreflight(request);
}
