using System.Security.Cryptography;
using System.Text;

namespace AyCode.Services.Nav;

/// <summary>
/// NAV authentikációs hash-ek. Az algoritmus a NAV-rendszereken közös (SHA-512, nagybetűs hex), ezért a base
/// rétegben él. (EKÁER 2.2 <c>UserHeaderType</c> doksija: <c>passwordHash</c> = SHA-512(jelszó) UPPER;
/// <c>requestSignature</c> = SHA-512(requestId + timestamp[yyyyMMddHHmmss] + aláírókulcs) UPPER.)
/// </summary>
/// <remarks>
/// Az Online Számla a <c>requestSignature</c>-höz SHA3-512-t használ — ha az kell, a <see cref="HashAlgorithm"/>
/// override-olható egy jövőbeli paraméterrel. Jelenleg az EKÁER SHA-512-jét implementálja.
/// </remarks>
public static class NavAuthHelper
{
    /// <summary>A signature timestamp-részének formátuma (NAV: év-hó-nap-óra-perc-mp, elválasztó nélkül).</summary>
    public const string SignatureTimestampFormat = "yyyyMMddHHmmss";

    /// <summary>SHA-512(<paramref name="password"/>) → 128 karakteres nagybetűs hex.</summary>
    public static string ComputePasswordHash(string password)
        => Sha512UpperHex(password);

    /// <summary>
    /// SHA-512(<c>requestId</c> + <c>timestamp</c>(UTC)[yyyyMMddHHmmss] + <c>signingKey</c>) → nagybetűs hex.
    /// A NAV az aláíráshoz a header-timestamp <b>UTC-megfelelőjét</b> várja, ezért <see cref="DateTime.ToUniversalTime"/>.
    /// (Hivatalos teszt-vektor: <c>Nav/docs/EKAER_INTERFACE.md</c>.)
    /// </summary>
    public static string ComputeRequestSignature(string requestId, DateTime timestamp, string signingKey)
        => Sha512UpperHex(requestId + timestamp.ToUniversalTime().ToString(SignatureTimestampFormat) + signingKey);

    private static string Sha512UpperHex(string input)
    {
        var hash = SHA512.HashData(Encoding.UTF8.GetBytes(input));
        return Convert.ToHexString(hash); // Convert.ToHexString → nagybetűs hex
    }
}
