using System.Text.Json.Serialization;
using MaBibli.Shared.Entites;
namespace MaBibli.Shared.Dtos;
/// Un auteur tel qu'exposé par l'API : de quoi l'afficher et cliquer dessus.
public record AuteurDto
{
public required int Id { get; init; }
public required string Nom { get; init; }
/// Nombre de livres du catalogue rattachés à cet auteur. Renseigné par la liste des auteurs.
public int NombreDeLivres { get; init; }
///
/// Rôle sur le livre où cet auteur figure. N'a de sens qu'à l'intérieur d'un
/// : la liste des auteurs, elle, ne parle d'aucun livre en
/// particulier et le laisse à NonPrecise.
///
public RoleAuteur Role { get; init; }
}
///
/// Un livre tel qu'exposé par l'API. Volontairement sans la collection de ses prêts :
/// le catalogue n'a besoin que de savoir si le livre est dehors, et l'historique complet se
/// demande à part (GET /api/livres/{id}/prets) pour ne pas alourdir chaque liste.
///
public record LivreDto
{
public required int Id { get; init; }
public string? Isbn { get; init; }
public required string Titre { get; init; }
/// Auteurs, dans l'ordre de la couverture. Peut être vide.
public IReadOnlyList Auteurs { get; init; } = [];
public IReadOnlyList Themes { get; init; } = [];
public string? Editeur { get; init; }
public required Format Format { get; init; }
///
/// Roman, bande dessinée… NonPrecise par défaut, qui ne veut pas dire « roman ».
///
public TypeDocument TypeDocument { get; init; }
///
/// Statut de lecture de l'utilisateur courant, ou null s'il n'en a jamais posé
/// (« non commencé »).
///
///
/// Ce champ dépend de qui appelle : le même livre remonte « Lu » pour l'un et null
/// pour l'autre. C'est voulu — le livre est commun, sa lecture ne l'est pas.
///
public Statut? Statut { get; init; }
/// Nombre de pages, ou null s'il n'a jamais été renseigné.
/// ⚠️ Jamais 0 pour dire « inconnu » : l'interface ne l'affiche que renseigné.
public int? NombrePages { get; init; }
public string? CoverUrl { get; init; }
public string? UrlNotice { get; init; }
public required DateTime DateAjout { get; init; }
///
/// Qui a saisi le livre. Information d'affichage, pas une frontière :
/// la bibliothèque est commune et aucune lecture ne filtre sur ce champ.
///
public string? AjoutePar { get; init; }
///
/// Nom de la personne qui a le livre en ce moment, ou null s'il est à la maison.
///
///
/// Commun à tout le foyer, contrairement au statut de lecture : un livre absent l'est
/// pour tout le monde. Renseigné depuis le prêt ouvert du livre — il ne peut y en avoir qu'un.
///
public string? PreteA { get; init; }
/// Date du prêt en cours, s'il y en a un.
public DateTime? PreteDepuis { get; init; }
[JsonIgnore]
public bool EstPrete => PreteA is not null;
/// Auteurs sur une ligne, pour un affichage compact.
[JsonIgnore]
public string? AuteursAffiches =>
Auteurs.Count == 0 ? null : string.Join(", ", Auteurs.Select(a => a.Nom));
}