using AyCode.Services.Nav.Ekaer.Models;
using TradeReasonType = AyCode.Services.Nav.Ekaer.Models.Common.TradeReasonType;

namespace FruitBank.Common.Services.Ekaer;

/// <summary>
/// Irány-független, normalizált szállítmány-modell. A bejövő (<c>ShippingDocument</c>-csoport) és a kimenő
/// (<c>OrderDto</c>) forrás EBBE képződik (a <see cref="IShippingToEkaerMapper"/> adapterei), és innen épül MIND a
/// NAV tradeCard (<see cref="IShippingToEkaerMapper.BuildTradeCard"/>), MIND a bejelentés-kötelezettség
/// (<see cref="EkaerReportability"/>). Így az irányfüggő tudás a két adapterre szorul, a közös logika egy helyen van.
/// Szerver-oldali köztes típus — NEM megy a SignalR-dróton.
/// </summary>
/// <remarks>
/// A fel-/lerakodási hely és a jármű már a NAV-típus (<see cref="LocationType"/>, <see cref="BasicVehicleDetailType"/>),
/// mert a saját telephely (<c>company.Site</c>) kész LocationType (Phone/Email/FELIR-mezőkkel) — azt átalakítás nélkül,
/// MEZŐVESZTÉS nélkül kell átengedni. A normalizálás (kötelezettséghez számít) a feladó/címzett országkódjára és a
/// tételek tömeg/érték-aggregálására korlátozódik.
/// </remarks>
public sealed class EkaerConsignment
{
    /// <summary>A forrás azonosítója (bejövőnél ShippingDocument.Id, kimenőnél Order.Id). Csoport-kiértékelésnél
    /// (több dokumentum) az első forrásé — a kötelezettség-döntés nem használja.</summary>
    public int ForeignKey { get; init; }

    public bool IsOutgoing { get; init; }

    /// <summary>Számla-pénznem (ISO 4217). A tétel <see cref="EkaerLine.ValueHuf"/> már KISZÁMOLT HUF-ban.</summary>
    public string? Currency { get; init; }

    /// <summary>Feladó / eladó (a kötelezettség az országkódját nézi).</summary>
    public EkaerEndpoint Seller { get; init; } = new();

    /// <summary>Címzett / vevő (a kötelezettség az országkódját nézi).</summary>
    public EkaerEndpoint Buyer { get; init; } = new();

    /// <summary>Felrakodási hely (NAV LocationType — pl. a saját telephely átengedve).</summary>
    public LocationType? LoadLocation { get; init; }

    /// <summary>Lerakodási hely (NAV LocationType — pl. a saját telephely átengedve).</summary>
    public LocationType? UnloadLocation { get; init; }

    public IReadOnlyList<EkaerLine> Lines { get; init; } = [];

    public BasicVehicleDetailType? Vehicle { get; init; }
    public BasicVehicleDetailType? Trailer { get; init; }
    public string? CarrierName { get; init; }
}

/// <summary>Egy fél (feladó/címzett) normalizálatlan adatai a NAV seller/destination mezőkhöz ÉS a kötelezettség
/// országkód-vizsgálatához. (A cím egysoros; a tagolt fel-/lerakodási helyet a <see cref="EkaerConsignment.LoadLocation"/>
/// / <see cref="EkaerConsignment.UnloadLocation"/> hordozza.)</summary>
public sealed class EkaerEndpoint
{
    public string? Name { get; init; }
    public string? VatNumber { get; init; }
    public string? CountryCode { get; init; }
    public string? FullAddress { get; init; }
}

/// <summary>Egy normalizált tétel. A <see cref="WeightKg"/> és a <see cref="ValueHuf"/> már KISZÁMOLT (HUF-ban),
/// hogy a küszöb-summa és a tradeCard ugyanazt használja (egyetlen érték-forrás).</summary>
public sealed class EkaerLine
{
    public string ExternalId { get; init; } = string.Empty;
    public string? Vtsz { get; init; }
    public string? Name { get; init; }
    public double WeightKg { get; init; }
    public long? ValueHuf { get; init; }
    public TradeReasonType TradeReason { get; init; }
}
