import { NextResponse } from "next/server";
import { canCompany, getCompanyContext } from "@/lib/company-context";
import { createAdminClient, createClient } from "@/lib/supabase-server";
import { credenciaisAtivas, lerConfiguracaoDoMercadoPago } from "@/lib/mercado-pago";
import { credenciaisAtivas as credenciaisDoAsaas, lerConfiguracaoDoAsaas } from "@/lib/asaas";
import { provedorDoLocal } from "@/lib/provedor-de-pagamento";

/*
  O balcão pode cobrar Pix?

  A resposta depende do que o dono configurou: qual provedor está ligado, as
  chaves do ambiente escolhido e, se quiser, a conta bancária onde o dinheiro
  cai. O caixa pergunta uma vez ao abrir e liga ou apaga a chave do Pix.

  Esta rota substituiu `/api/pdv/mercado-pago`, que tinha o nome de um provedor
  só no endereço. O nome do provedor volta no corpo, porque a tela do balcão
  escreve ele para o operador — e dizer "Mercado Pago" enquanto se cobra pelo
  Asaas é o tipo de mentira que só aparece quando o dinheiro some.

  O checkout do catálogo não entra na conta aqui: quem vende só presencial
  mantém a loja online fechada e mesmo assim precisa do QR no caixa.
*/

export const runtime = "nodejs";

const NOME_DO_PROVEDOR: Record<string, string> = {
  mercado_pago: "Mercado Pago",
  asaas: "Asaas",
};

export async function GET() {
  const supabase = await createClient();
  const {
    data: { user },
  } = await supabase.auth.getUser();
  if (!user) return NextResponse.json({ error: "Não autenticado." }, { status: 401 });

  const ctx = await getCompanyContext(supabase, user);
  if (!canCompany(ctx, user.id, "pdv.read")) {
    return NextResponse.json({ error: "Sem permissão para usar o PDV." }, { status: 403 });
  }

  const ownerId = ctx.ownerId || user.id;
  const admin = createAdminClient();

  let escolhido: Awaited<ReturnType<typeof provedorDoLocal>> = null;
  try {
    escolhido = await provedorDoLocal(admin as never, ownerId, "balcao", "pix");
  } catch (erro) {
    return NextResponse.json(
      { error: erro instanceof Error ? erro.message : "Falha ao ler a integração." },
      { status: 500 }
    );
  }

  if (!escolhido) {
    return NextResponse.json({
      ok: true,
      disponivel: false,
      provedor: null,
      provedorNome: null,
      motivo: "Nenhum provedor foi configurado para o Pix do balcão.",
    });
  }

  const provedor = escolhido.provedor;
  const provedorNome = NOME_DO_PROVEDOR[provedor] || provedor;

  /* A credencial já foi conferida pelo selecionador; aqui ela é lida de novo
     só para saber o ambiente e a conta de destino. */
  let ambiente: "sandbox" | "production";
  let bankAccountId: string | null;

  if (provedor === "asaas") {
    const config = lerConfiguracaoDoAsaas(escolhido.integracao.settings);
    const credenciais = credenciaisDoAsaas(config);
    if (!credenciais) {
      return NextResponse.json({
        ok: true,
        disponivel: false,
        provedor,
        provedorNome,
        motivo: `Falta a chave do ambiente ${config.environment === "production" ? "de produção" : "de testes"} na integração do Asaas.`,
      });
    }
    ambiente = credenciais.ambiente;
    bankAccountId = config.bank_account_id;
  } else {
    const config = lerConfiguracaoDoMercadoPago(escolhido.integracao.settings);
    const credenciais = credenciaisAtivas(config);
    if (!credenciais) {
      return NextResponse.json({
        ok: true,
        disponivel: false,
        provedor,
        provedorNome,
        motivo: `Faltam as chaves do ambiente ${config.environment === "production" ? "de produção" : "de testes"} na integração.`,
      });
    }
    ambiente = credenciais.ambiente;
    bankAccountId = config.bank_account_id;
  }

  let conta: { id: string; nome: string } | null = null;
  if (bankAccountId) {
    const { data } = await admin
      .from("bank_accounts")
      .select("id,name,bank_name,active")
      .eq("id", bankAccountId)
      .eq("company_id", ctx.companyId)
      .maybeSingle();
    const linha = data as { id: string; name: string | null; bank_name: string | null; active: boolean | null } | null;
    if (linha?.id && linha.active !== false) {
      conta = { id: linha.id, nome: linha.name || linha.bank_name || `Conta do ${provedorNome}` };
    }
  }

  return NextResponse.json({
    ok: true,
    disponivel: true,
    provedor,
    provedorNome,
    ambiente,
    conta,
  });
}
