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

import { criarLinkDaEntrega } from "./entrega";
import { enderecoDaLoja, lerLojaDosDigitais } from "./loja";

/*
 * Produto digital vendido no balcão (PDV). O pedido nasce pago e o gatilho do
 * banco libera a entrega na hora (o e-mail sai pela fila, se o cliente tem
 * e-mail); o balcão mostra o QR code do link da entrega para o cliente
 * apontar o celular ali mesmo.
 */

const ABERTOS = ["ativo", "aguardando_arquivo", "aguardando_codigo", "agendado"];

/* O cliente técnico do PDV ("Cliente balcão"): não recebe produto digital. */
export function ehClienteDoBalcao(cliente: { name?: string | null; company_name?: string | null } | null): boolean {
  return Boolean(cliente && cliente.name === "Cliente balcão" && cliente.company_name === "PDV");
}

/** A entrega da venda do balcão: libera (se o gatilho ainda não liberou) e cria o link para o QR code. */
export async function entregaDaVendaNoPdv(
  admin: SupabaseClient,
  params: { lojaId: string; pedidoId: string; clienteId: string; quem: string; request: Request }
): Promise<{ link: string } | null> {
  const { count } = await admin
    .from("digital_entitlements")
    .select("id", { count: "exact", head: true })
    .eq("user_id", params.lojaId)
    .eq("order_id", params.pedidoId)
    .in("status", ABERTOS);
  if (!count) {
    const { data, error } = await admin.rpc("liberar_entregas_digitais", { p_order_id: params.pedidoId, p_forcar: false, p_quem: params.quem });
    if (error || !(data as { ok?: boolean } | null)?.ok) return null;
  }
  const loja = await lerLojaDosDigitais(admin, params.lojaId);
  const base = enderecoDaLoja(params.request, loja);
  if (!base) return null;
  const link = await criarLinkDaEntrega(admin, { lojaId: params.lojaId, orderId: params.pedidoId, clienteId: params.clienteId, catalogOrderId: null, base });
  return link ? { link } : null;
}
