using System.Text.Json.Serialization;

namespace MaBibli.Shared.Dtos;

/// <summary>
/// Un prêt tel qu'exposé par l'API — en cours ou clos, la table gardant l'historique complet.
/// </summary>
/// <remarks>
/// Les champs <c>Livre*</c> recopient de quoi afficher le livre sans second appel : la vue
/// « prêts en cours » liste des prêts, mais ce que l'utilisateur y cherche est <b>le livre</b>
/// qui n'est plus à la maison.
/// </remarks>
public record PretDto
{
    public required int Id { get; init; }

    public required int LivreId { get; init; }

    /// <summary>Nom de l'emprunteur, texte libre : aucun lien avec les comptes YunoHost.</summary>
    public required string Emprunteur { get; init; }

    public required DateTime DatePret { get; init; }

    /// <summary><c>null</c> tant que le livre n'a pas été rendu.</summary>
    public DateTime? DateRetour { get; init; }

    public string? LivreTitre { get; init; }

    /// <summary>Auteurs du livre sur une ligne, déjà mis en forme par le serveur.</summary>
    public string? LivreAuteurs { get; init; }

    public string? LivreCoverUrl { get; init; }

    [JsonIgnore]
    public bool EstEnCours => DateRetour is null;

    /// <summary>Nombre de jours écoulés depuis le départ du livre — ou durée totale s'il est rendu.</summary>
    [JsonIgnore]
    public int JoursEcoules =>
        Math.Max(0, (int)((DateRetour ?? DateTime.UtcNow) - DatePret).TotalDays);
}

/// <summary>Charge utile d'un nouveau prêt.</summary>
/// <remarks>
/// Le livre n'y figure pas : il vient de l'URL. On ne prête pas « un livre quelconque », on prête
/// <b>ce</b> livre-ci, depuis sa fiche.
/// </remarks>
public record EnregistrementPret
{
    /// <summary>Obligatoire : un prêt sans emprunteur ne se retrouve pas.</summary>
    public string Emprunteur { get; set; } = string.Empty;

    /// <summary>
    /// Date du prêt en UTC. <c>null</c> = maintenant.
    /// </summary>
    /// <remarks>
    /// Modifiable parce qu'on enregistre souvent un prêt <b>après</b> l'avoir fait — « tiens,
    /// Paul a mon Zola depuis Noël ». Une date future est en revanche refusée : elle ne
    /// correspondrait à rien de constatable.
    /// </remarks>
    public DateTime? DatePret { get; set; }
}

/// <summary>Charge utile du retour d'un livre.</summary>
public record RetourPret
{
    /// <summary>Date du retour en UTC. <c>null</c> = maintenant.</summary>
    public DateTime? DateRetour { get; set; }
}
