using System.Collections.Generic;
using System.Linq;
using Prefab.Catalog.Domain.Entities;
namespace Prefab.Web.Pricing;
public sealed record FromPriceResult(decimal? Amount, string? Currency, bool IsPriced);
///
/// Computes a display-friendly "from price" for catalog products by examining model and variant pricing.
///
public sealed class FromPriceCalculator
{
private const string DefaultCurrency = "USD";
private readonly string _currencyCode;
public FromPriceCalculator(string? currencyCode = null)
{
_currencyCode = string.IsNullOrWhiteSpace(currencyCode) ? DefaultCurrency : currencyCode.Trim();
}
public FromPriceResult Compute(Product product)
{
ArgumentNullException.ThrowIfNull(product);
if (product.Price.HasValue)
{
return new FromPriceResult(product.Price.Value, _currencyCode, true);
}
var variantPrices = ExtractVariantPrices(product.Variants);
if (variantPrices.Count > 0)
{
var minimum = variantPrices.Min();
return new FromPriceResult(minimum, _currencyCode, true);
}
return new FromPriceResult(null, null, false);
}
private static List ExtractVariantPrices(IEnumerable variants) =>
variants
.Where(variant => variant is { Kind: ProductKind.Variant, Price: not null })
.Select(variant => variant.Price!.Value)
.ToList();
}