namespace AyCode.Services.Nav;

/// <summary>
/// NAV API hitelesítő adatok. A konkrét megvalósítás konfigurációból (appsettings / secret store) tölti —
/// soha NEM hardcode-olva a forráskódban.
/// </summary>
public interface INavCredentials
{
    /// <summary>Technikai felhasználónév (EKÁER: <c>user</c>, Online Számla: <c>login</c>).</summary>
    string User { get; }

    /// <summary>A jelszó nyers értéke. Ebből számolódik a <c>passwordHash</c> (SHA-512). A hash-t küldjük, sosem a nyers jelszót.</summary>
    string Password { get; }

    /// <summary>A titkos aláírókulcs (XML aláírókulcs). A <c>requestSignature</c> számításához.</summary>
    string SigningKey { get; }

    /// <summary>Adószám (EKÁER: <c>VATNumber</c>, Online Számla: <c>taxNumber</c>).</summary>
    string TaxNumber { get; }

    /// <summary>A NAV service báziscíme, pl. <c>https://import.ekaer.nav.gov.hu</c> (záró perjel nélkül vagy azzal).</summary>
    string BaseUrl { get; }
}

/// <summary>
/// A NAV request alap-headerének közös szerződése (requestId + timestamp). A NAV-rendszerek mind hordozzák ezt.
/// Az adott NAV API generált header-típusa <c>partial class</c>-szal implementálja (a property-nevek általában
/// már egyeznek, így implicit teljesül).
/// </summary>
public interface INavRequestHeader
{
    /// <summary>Egyedi kérés-azonosító (minden requestnél más).</summary>
    string RequestId { get; set; }

    /// <summary>A kérés keletkezésének ideje. Ugyanaz az időpont, amiből a <c>requestSignature</c> timestamp-része képződik.</summary>
    DateTime Timestamp { get; set; }
}

/// <summary>
/// A NAV request auth-headerének közös szerződése. A 2 hash-mező (<c>PasswordHash</c>, <c>RequestSignature</c>)
/// elem-neve azonos minden NAV API-ban; a felhasználó- és adószám-mező C#-szinten egységesítve (a generált
/// típus <c>partial</c>-ja explicit map-eli, ha a generált név eltér — pl. EKÁER <c>VatNumber</c> → <c>TaxNumber</c>).
/// </summary>
public interface INavUserHeader
{
    string User { get; set; }
    string PasswordHash { get; set; }
    string TaxNumber { get; set; }
    string RequestSignature { get; set; }
}

/// <summary>
/// Egy NAV authentikált kérés szerződése: hozzáférést ad a base-headerhez és az auth-headerhez, hogy a
/// <see cref="NavReportServiceBase{TRequest,TResponse}"/> egységesen feltölthesse őket — API-független módon.
/// </summary>
public interface INavRequest
{
    INavRequestHeader RequestHeader { get; }
    INavUserHeader UserHeader { get; }
}

/// <summary>
/// A NAV válasz eredmény-blokkjának közös szerződése (funcCode/reasonCode/msg absztrakciója).
/// </summary>
public interface INavResult
{
    /// <summary>Igaz, ha a feldolgozás sikeres (funcCode == OK).</summary>
    bool IsSuccess { get; }

    /// <summary>A végrehajtási eredmény kódja (reasonCode), ha van.</summary>
    string? ReasonCode { get; }

    /// <summary>Szöveges üzenet, jellemzően hiba/figyelmeztetés esetén.</summary>
    string? Message { get; }
}

/// <summary>
/// Egy NAV válasz szerződése: hozzáférést ad az eredmény-blokkhoz, hogy a base egységesen ellenőrizhesse a sikerességet.
/// </summary>
public interface INavResponse
{
    INavResult Result { get; }
}
