import type { Metadata } from "next";
import { headers } from "next/headers";
import { redirect } from "next/navigation";

import { avaliarPedido, lerParametros } from "@/lib/assistentes/oauth/permitir";

import TelaDePermissao from "./tela";

export const dynamic = "force-dynamic";

export const metadata: Metadata = {
  title: "Conectar um assistente · Ktalogu",
  robots: { index: false, follow: false },
};

/**
 * A tela de permitir.
 *
 * É para cá que o Claude ou o ChatGPT mandam a pessoa quando ela clica em
 * "Conectar". A pessoa entra com a conta dela (se ainda não estiver logada),
 * vê quem está pedindo acesso e a que empresa, escolhe o que o assistente pode
 * fazer e clica em "Permitir". Só então nasce o código que volta para o
 * programa.
 *
 * O que chega aqui é conferido antes de qualquer coisa aparecer; para a tela
 * vai só o que ela precisa mostrar.
 */
export default async function PaginaDePermissao({ searchParams }: { searchParams: Promise<Record<string, string | string[] | undefined>> }) {
  const parametros = lerParametros(await searchParams);
  /* O endereço em si não importa: quem diz por onde o pedido chegou são os cabeçalhos. */
  const avaliacao = await avaliarPedido({ url: "http://localhost/oauth/authorize", headers: await headers() }, parametros);

  if (avaliacao.tipo === "voltar") redirect(avaliacao.destino);

  if (avaliacao.tipo === "erro") return <TelaDePermissao situacao={{ tipo: "erro", mensagem: avaliacao.mensagem }} parametros={{}} />;
  if (avaliacao.tipo === "entrar") return <TelaDePermissao situacao={{ tipo: "entrar", programa: avaliacao.programa }} parametros={parametros} />;
  if (avaliacao.tipo === "sem_acesso") {
    return (
      <TelaDePermissao
        situacao={{ tipo: "sem_acesso", programa: avaliacao.programa, mensagem: avaliacao.mensagem, email: avaliacao.email, voltar: avaliacao.voltar }}
        parametros={parametros}
      />
    );
  }
  return (
    <TelaDePermissao
      situacao={{
        tipo: "permitir",
        programa: avaliacao.programa,
        email: avaliacao.email,
        empresa: avaliacao.empresa,
        pediuEscrita: avaliacao.pediuEscrita,
      }}
      parametros={parametros}
    />
  );
}
