using FruitBank.Common.Dtos;
using FruitBank.Common.Entities;

namespace FruitBank.Common.Services.Ekaer;

/// <summary>
/// A tétel-érték HUF-ra számítása — közös a leképezés (tradeCardItem.value) és a küszöb-kapu
/// (<c>CreateMissingEkaerHistories</c>) között, hogy a kétféle számítás ne csúszhasson el egymástól.
/// </summary>
/// <remarks>
/// A forrás-pénznem a <c>Partner.Currency</c> (ISO 4217). Jelenleg csak HUF és EUR van használatban
/// (100%-ban a partnerből következik): HUF → nincs átváltás, minden más → EUR-ként, az árfolyammal.
/// Ha valaha más deviza is megjelenik, ezt a feltevést bővíteni kell (akkor per-deviza árfolyam kell).
/// </remarks>
public static class EkaerValueCalculator
{
    public static bool IsHuf(string? currency) => string.Equals(currency?.Trim(), "HUF", StringComparison.OrdinalIgnoreCase);

    /// <summary>A forrás-pénznem → HUF szorzó. HUF → 1 (árfolyam nem kell). Minden más (EUR) → a megadott
    /// EUR-HUF árfolyam; ha az hiányzik/0, <see cref="InvalidOperationException"/> — soha nem számolunk elavult /
    /// üres árfolyammal (a config-default szándékosan nincs).</summary>
    public static double ResolveRateToHuf(string? currency, double eurHufRate)
    {
        if (IsHuf(currency)) return 1d;
        if (eurHufRate <= 0)
            throw new InvalidOperationException(
                "EKÁER EUR-HUF árfolyam nincs konfigurálva (appsettings Ekaer:ExchangeRate:EurHuf) — külföldi (nem HUF) értéket nem lehet HUF-ra számolni.");
        return eurHufRate;
    }

    /// <summary>Egy tétel értéke a számla pénznemében (egységár × dokumentum-mennyiség), átváltás előtt.</summary>
    public static double ItemLineValue(ShippingItem item) => item.UnitPriceOnDocument * item.QuantityOnDocument;

    /// <summary>Egy tétel értéke HUF-ban, egészre kerekítve. A NAV <c>value &gt; 0</c>-t vár — 0/ismeretlen
    /// esetén <c>null</c> (a mezőt nem töltjük, a validátor jelzi, ha kötelező lenne).</summary>
    public static long? ItemValueHuf(ShippingItem item, double rateToHuf)
    {
        var huf = Math.Round(ItemLineValue(item) * rateToHuf, MidpointRounding.AwayFromZero);
        return huf > 0 ? (long)huf : null;
    }

    // ── Kimenő (Order) változatok ────────────────────────────────────────────
    // Az érték a NETTÓ (ÁFA nélküli) egységár × mennyiség — az EKÁER „nettó érték"-et vár.

    /// <summary>Egy rendelés-tétel nettó értéke a számla pénznemében (UnitPriceExclTax × mennyiség), átváltás előtt.</summary>
    public static double ItemLineValue(OrderItemDto item) => (double)item.UnitPriceExclTax * item.Quantity;

    /// <summary>Egy rendelés-tétel értéke HUF-ban, egészre kerekítve. 0/ismeretlen → <c>null</c> (lásd a bejövő párját).</summary>
    public static long? ItemValueHuf(OrderItemDto item, double rateToHuf)
    {
        var huf = Math.Round(ItemLineValue(item) * rateToHuf, MidpointRounding.AwayFromZero);
        return huf > 0 ? (long)huf : null;
    }
}
