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

import {
  COLUNAS_DA_DEFINICAO,
  normalizarDefinicoes,
  valoresDaLinha,
  valoresQuePassamParaOPedido,
  type DefinicaoDeCampo,
  type EntidadeDoCampo,
} from "./campos-proprios";

/**
 * As idas ao banco dos campos próprios, iguais no navegador e no servidor.
 * A trava da tabela (migration 187) já limita à empresa de quem está logado.
 */

export async function lerDefinicoes(
  supabase: SupabaseClient,
  entidade?: EntidadeDoCampo,
  { soAtivos = false }: { soAtivos?: boolean } = {}
): Promise<{ definicoes: DefinicaoDeCampo[]; erro: string | null }> {
  let consulta = supabase.from("campos_proprios").select(COLUNAS_DA_DEFINICAO).order("posicao", { ascending: true }).limit(500);
  if (entidade) consulta = consulta.eq("entidade", entidade);
  if (soAtivos) consulta = consulta.eq("ativo", true);
  const { data, error } = await consulta;
  if (error) return { definicoes: [], erro: error.message };
  return { definicoes: normalizarDefinicoes(data, entidade), erro: null };
}

/**
 * Depois de o orçamento virar pedido: os valores do orçamento que têm campo
 * de pedido com a mesma chave passam para o pedido. Nunca derruba a
 * aprovação: qualquer falha só fica no log.
 */
export async function herdarCamposDoOrcamento(supabase: SupabaseClient, quoteId: string, orderId: string): Promise<void> {
  try {
    const [{ data: orcamento }, { data: pedido }] = await Promise.all([
      supabase.from("quotes").select("campos_proprios").eq("id", quoteId).maybeSingle(),
      supabase.from("orders").select("campos_proprios").eq("id", orderId).maybeSingle(),
    ]);
    const doOrcamento = valoresDaLinha((orcamento as { campos_proprios?: unknown } | null)?.campos_proprios);
    if (!Object.keys(doOrcamento).length || !pedido) return;

    const { definicoes, erro } = await lerDefinicoes(supabase, "pedido", { soAtivos: true });
    if (erro || !definicoes.length) return;

    const atuais = valoresDaLinha((pedido as { campos_proprios?: unknown }).campos_proprios);
    const juntos = valoresQuePassamParaOPedido(definicoes, doOrcamento, atuais);
    if (JSON.stringify(juntos) === JSON.stringify(atuais)) return;

    const { error } = await supabase.from("orders").update({ campos_proprios: juntos }).eq("id", orderId);
    if (error) console.error("[campos-proprios] não passou os campos do orçamento para o pedido:", error.message);
  } catch (falha) {
    console.error("[campos-proprios] não passou os campos do orçamento para o pedido:", falha);
  }
}
