import type { MarketplaceProduct } from "@/lib/marketplace-data";

function formatMoney(value: number) {
  return new Intl.NumberFormat("pt-BR", {
    style: "currency",
    currency: "BRL",
  }).format(Number(value) || 0);
}

export function getMinimumVariationUnitPrice(
  attributes?: MarketplaceProduct["product_attributes"] | null
) {
  const list = Array.isArray(attributes) ? attributes : [];
  if (!list.length) return 0;
  const hasRequiredAttribute = list.some((attribute) => Boolean(attribute?.is_required));
  const relevantAttributes = hasRequiredAttribute
    ? list.filter((attribute) => Boolean(attribute?.is_required))
    : list;
  let total = 0;
  for (const attribute of relevantAttributes) {
    const options = Array.isArray(attribute?.options) ? attribute.options : [];
    const optionPrices = options
      .map((option) => (typeof option === "string" ? 0 : Number(option?.price) || 0))
      .filter((value) => Number.isFinite(value) && value >= 0);
    if (!optionPrices.length) continue;
    total += Math.min(...optionPrices);
  }
  return Math.max(0, total);
}

export function getMarketplaceDisplayPrice(product: MarketplaceProduct) {
  if (product.price_on_request) {
    return {
      label: "Sob consulta",
      numericValue: null as number | null,
      startsAt: false,
    };
  }

  if (product.use_variation_price_only) {
    const minimumVariationPrice = getMinimumVariationUnitPrice(product.product_attributes);
    return {
      label: minimumVariationPrice > 0 ? formatMoney(minimumVariationPrice) : formatMoney(0),
      numericValue: minimumVariationPrice,
      startsAt: true,
    };
  }

  const basePrice = Number(product.price) || 0;
  const tierPrices = (product.product_price_tiers || [])
    .filter((tier) => tier.active !== false)
    .map((tier) => Number(tier.unit_price))
    .filter((value) => Number.isFinite(value) && value > 0);
  const lowestTier = tierPrices.length > 0 ? Math.min(...tierPrices) : null;
  const showcasePrice = lowestTier !== null ? Math.min(basePrice, lowestTier) : basePrice;

  return {
    label: formatMoney(showcasePrice),
    numericValue: showcasePrice,
    startsAt: lowestTier !== null && lowestTier < basePrice,
  };
}
