using System.ComponentModel.DataAnnotations;

namespace AyCode.Services.Nav.Ekaer;

/// <summary>Az EKÁER validációs üzenet súlyossága.</summary>
public enum EkaerSeverity
{
    /// <summary>Nem blokkoló — a bejelentés beküldhető, de valamit pótolni kell (pl. a rendszám a felrakodásig).</summary>
    Warning,

    /// <summary>Blokkoló — a NAV elutasítaná; beküldés előtt javítandó.</summary>
    Error,
}

/// <summary>
/// Súlyossággal (warning/error) bővített validációs eredmény. A <see cref="ValidationResult"/>-ból származik,
/// így a meglévő fogyasztók (akik csak az <c>ErrorMessage</c>-et használják) változatlanul működnek; aki a
/// szintet is akarja, a <see cref="Severity"/>-t / a <c>GetSeverity()</c> kiterjesztést használja.
/// </summary>
public sealed class EkaerValidationMessage(EkaerSeverity severity, string message) : ValidationResult(message)
{
    public EkaerSeverity Severity { get; } = severity;
}

/// <summary>Súlyosság-segédek a validációs eredmény-listához.</summary>
public static class EkaerValidationExtensions
{
    /// <summary>A súlyosság; egy sima (nem <see cref="EkaerValidationMessage"/>) eredmény konzervatívan <see cref="EkaerSeverity.Error"/>.</summary>
    public static EkaerSeverity GetSeverity(this ValidationResult result)
        => result is EkaerValidationMessage m ? m.Severity : EkaerSeverity.Error;

    /// <summary>Van-e blokkoló (error) szintű üzenet — ennek alapján NEM küldhető a bejelentés.</summary>
    public static bool HasErrors(this IEnumerable<ValidationResult> results) => results.Any(r => r.GetSeverity() == EkaerSeverity.Error);

    /// <summary>Van-e warning szintű üzenet (a beküldést nem blokkolja, de pótlandó).</summary>
    public static bool HasWarnings(this IEnumerable<ValidationResult> results) => results.Any(r => r.GetSeverity() == EkaerSeverity.Warning);
}
