using System.Text.Json.Serialization;

namespace PSLauncher.Models;

public sealed class LicenseValidationResponse
{
    [JsonPropertyName("status")]
    public string Status { get; set; } = "invalid";

    [JsonPropertyName("licenseId")]
    public string? LicenseId { get; set; }

    [JsonPropertyName("ownerName")]
    public string? OwnerName { get; set; }

    [JsonPropertyName("issuedAt")]
    public DateTime? IssuedAt { get; set; }

    [JsonPropertyName("downloadEntitlementUntil")]
    public DateTime? DownloadEntitlementUntil { get; set; }

    [JsonPropertyName("maxMachines")]
    public int? MaxMachines { get; set; }

    /// <summary>
    /// Channel de manifest associé à la license. NULL = manifest default
    /// (versions.json). Sinon le launcher fetch versions-{Channel}.json. Le
    /// champ est inclus dans la signature Ed25519, donc un user ne peut pas
    /// modifier sa réponse cachée pour basculer sur un autre channel.
    /// </summary>
    [JsonPropertyName("channel")]
    public string? Channel { get; set; }

    /// <summary>
    /// True si la license autorise l'affichage des versions taggées
    /// <c>isBeta=true</c> dans le launcher. Le filtrage est côté client (le
    /// serveur peut servir le manifest complet — la signature Ed25519
    /// protège contre toute modif locale du flag).
    /// </summary>
    [JsonPropertyName("canSeeBetas")]
    public bool CanSeeBetas { get; set; }

    /// <summary>
    /// Hash SHA-256 (hex lowercase) du mot de passe qui verrouille les Settings
    /// avancés du launcher. NULL = pas de verrouillage. Défini par-license dans
    /// le backoffice (table <c>licenses.settings_lock_password_hash</c>) → permet
    /// un mot de passe différent par client. Inclus dans la signature Ed25519.
    /// </summary>
    [JsonPropertyName("settingsLockPasswordHash")]
    public string? SettingsLockPasswordHash { get; set; }

    [JsonPropertyName("serverTime")]
    public DateTime? ServerTime { get; set; }

    [JsonPropertyName("message")]
    public string? Message { get; set; }

    [JsonPropertyName("signature")]
    public string? Signature { get; set; }

    public bool IsValid => Status == "valid";
    public bool IsExpired => Status == "expired";

    public bool CanDownload(VersionManifest version)
    {
        if (!IsValid && !IsExpired) return false;
        if (DownloadEntitlementUntil is null) return false;
        if (version.MinLicenseDate is null) return true; // pas de minimum imposé
        return DownloadEntitlementUntil >= version.MinLicenseDate;
    }
}

public sealed class LicenseValidationRequest
{
    [JsonPropertyName("licenseKey")] public string LicenseKey { get; set; } = string.Empty;
    [JsonPropertyName("machineId")] public string MachineId { get; set; } = string.Empty;
    [JsonPropertyName("machineLabel")] public string? MachineLabel { get; set; }
    [JsonPropertyName("launcherVersion")] public string LauncherVersion { get; set; } = string.Empty;
}
