import type { SupabaseClient } from "@supabase/supabase-js";

import { carregarPagamento, meiosDoLocal } from "@/lib/provedor-de-pagamento";

import { lerAjustesDaLoja, type AjustesDaLoja } from "../ajustes";
import { lerConfigDigitalDaLoja, prazoQueVale, type ConfigDigitalDaLoja } from "../produto";

/*
 * O que a página de um produto digital precisa além do produto: o que vem na
 * compra (público), o prazo que vale, e se a loja recebe Pix ou cartão online
 * (sem nenhum dos dois, a compra rápida não existe e o botão vira WhatsApp).
 */

export type VitrineDoDigital = {
  config: ConfigDigitalDaLoja;
  prazoDias: number | null;
  meios: Array<"pix" | "cartao">;
  ajustes: AjustesDaLoja;
};

export async function lerAjustesDigitais(admin: SupabaseClient, lojaId: string): Promise<AjustesDaLoja> {
  const { data } = await admin.from("digital_settings").select("config").eq("user_id", lojaId).maybeSingle();
  return lerAjustesDaLoja((data as { config?: unknown } | null)?.config);
}

export async function lerVitrineDoDigital(admin: SupabaseClient, lojaId: string, digitalConfig: unknown): Promise<VitrineDoDigital> {
  const config = lerConfigDigitalDaLoja(digitalConfig);
  const [ajustes, meios] = await Promise.all([
    lerAjustesDigitais(admin, lojaId).catch(() => lerAjustesDaLoja(null)),
    carregarPagamento(admin as never, lojaId)
      .then((estado) => meiosDoLocal(estado, "loja"))
      .catch(() => []),
  ]);
  const daCompra = Array.from(
    new Set(meios.map((m) => m.meio).filter((m): m is "pix" | "cartao" => m === "pix" || m === "cartao"))
  ).sort((a, b) => (a === "pix" ? -1 : b === "pix" ? 1 : 0));
  return { config, prazoDias: prazoQueVale(config.prazoDias, ajustes.prazoDias), meios: daCompra, ajustes };
}

export type PagamentoDaCompra = {
  meios: Array<"pix" | "cartao">;
  /* O cartão é concluído fora da loja (fatura do Asaas). */
  cartaoSaiDaLoja: boolean;
  /* A chave pública do Mercado Pago para o formulário do cartão (é pública). */
  mercadoPago: { ambiente: "sandbox" | "production"; chavePublica: string } | null;
};

/* Como a compra rápida desta loja cobra: Pix e cartão, e por qual provedor. */
export async function lerPagamentoDaCompra(admin: SupabaseClient, lojaId: string): Promise<PagamentoDaCompra> {
  const { resolveMercadoPagoPublicConfig } = await import("@/lib/mercado-pago");
  const meios = await carregarPagamento(admin as never, lojaId)
    .then((estado) => meiosDoLocal(estado, "loja"))
    .catch(() => []);
  const daCompra = meios.filter((m) => m.meio === "pix" || m.meio === "cartao");
  const cartao = daCompra.find((m) => m.meio === "cartao") ?? null;
  const publico = cartao && cartao.provedor === "mercado_pago" ? resolveMercadoPagoPublicConfig(cartao.integracao as never) : null;
  return {
    meios: Array.from(new Set(daCompra.map((m) => m.meio as "pix" | "cartao"))).sort((a, b) => (a === "pix" ? -1 : b === "pix" ? 1 : 0)),
    cartaoSaiDaLoja: Boolean(cartao && cartao.provedor === "asaas"),
    mercadoPago: publico ? { ambiente: publico.environment, chavePublica: publico.publicKey } : null,
  };
}
