import { lerGrupos, lerServicos, servicosDoProduto, type GrupoDeServicos, type ServicoOpcional } from "@/lib/servicos-opcionais";

/*
  Os serviços que um produto oferece, prontos para a página.

  A biblioteca é da empresa e o vínculo é do produto: a resolução ("o vínculo
  manda; sem vínculo, vale o padrão do serviço") acontece aqui, no servidor,
  para a vitrine receber a lista já decidida.

  O custo do serviço NÃO passa por aqui de propósito. Ele mora em outra tabela,
  que a chave pública não lê — minutos de designer não são assunto do cliente.
*/

type ClienteSupabase = {
  from: (tabela: string) => {
    select: (colunas: string) => {
      eq: (coluna: string, valor: string) => Promise<{ data: unknown; error: unknown }> & {
        eq: (coluna: string, valor: unknown) => Promise<{ data: unknown; error: unknown }>;
      };
    };
  };
};

export type ServicosDaLoja = {
  grupos: GrupoDeServicos[];
  servicos: ServicoOpcional[];
};

const VAZIO: ServicosDaLoja = { grupos: [], servicos: [] };

export async function carregarServicosDoProduto(
  supabase: unknown,
  lojaId: string,
  produtoId: string
): Promise<ServicosDaLoja> {
  const cliente = supabase as ClienteSupabase;
  try {
    const [gruposRes, servicosRes, vinculosRes] = await Promise.all([
      cliente.from("service_groups").select("id,name,selection_mode,required,position,active").eq("user_id", lojaId),
      cliente
        .from("optional_services")
        .select("id,group_id,title,description,details,icon,price,charge_per_unit,apply_to_all,position,active")
        .eq("user_id", lojaId),
      cliente.from("product_optional_services").select("service_id,enabled").eq("product_id", produtoId),
    ]);

    /* Banco sem a migração 113: a loja abre igual, só não mostra serviço. */
    if (gruposRes.error || servicosRes.error) return VAZIO;

    const biblioteca = lerServicos(servicosRes.data);
    const oferecidos = servicosDoProduto(
      biblioteca,
      (vinculosRes.error ? [] : (vinculosRes.data as Array<{ service_id?: unknown; enabled?: unknown }>)) || []
    );
    if (oferecidos.length === 0) return VAZIO;

    return { grupos: lerGrupos(gruposRes.data), servicos: oferecidos };
  } catch {
    return VAZIO;
  }
}
