using System.Text.Json.Serialization;
using MaBibli.Shared.Entites;
namespace MaBibli.Shared.Dtos;
///
/// Charge utile de création et de modification d'un livre.
///
///
/// n'y figure pas volontairement : il est déterminé par le serveur
/// à partir de l'utilisateur authentifié, jamais par le client.
///
public record EnregistrementLivre
{
/// Séparateur des auteurs dans la forme texte d'un champ de saisie.
///
/// Le point-virgule, et non la virgule : celle-ci est déjà prise par la forme
/// bibliographique « Zola, Émile », qu'on doit pouvoir taper telle quelle.
///
public const char SeparateurAuteurs = ';';
/// Facultatif : certains livres n'ont pas d'ISBN. Normalisé par le serveur.
public string? Isbn { get; set; }
public string Titre { get; set; } = string.Empty;
///
/// Noms des auteurs, dans l'ordre de la couverture. Le serveur les rattache aux fiches
/// existantes quand c'est sûr, et en crée sinon.
///
public List Auteurs { get; set; } = [];
public string? Editeur { get; set; }
public Format Format { get; set; }
/// Roman, bande dessinée… Facultatif : « non précisé » est une réponse valable.
public TypeDocument TypeDocument { get; set; }
///
/// Statut de lecture de l'appelant. null = non commencé, et aucune ligne n'est
/// alors écrite en base.
///
public Statut? Statut { get; set; }
public string? CoverUrl { get; set; }
///
/// Vue « une seule ligne » de , pour les champs de saisie simples.
///
///
/// Non sérialisée : est la forme de référence sur le fil. Cette
/// propriété existe pour que l'interface puisse lier un <input> unique sans
/// avoir à gérer une liste dynamique — un foyer saisit un auteur dans l'immense majorité
/// des cas, et les rares livres à quatre auteurs se tapent avec des « ; ».
///
[JsonIgnore]
public string? Auteur
{
get => Auteurs.Count == 0 ? null : string.Join($"{SeparateurAuteurs} ", Auteurs);
set => Auteurs = Decouper(value);
}
/// Découpe une saisie texte en noms d'auteurs, en écartant les entrées vides.
public static List Decouper(string? saisie) =>
string.IsNullOrWhiteSpace(saisie)
? []
: saisie.Split(SeparateurAuteurs, StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries)
.ToList();
}
/// Charge utile du changement de statut de lecture — l'action la plus fréquente.
///
/// Le statut posé est toujours celui de l'appelant : il n'y a pas de champ « utilisateur »,
/// et il ne doit jamais y en avoir. Personne ne coche « lu » à la place d'un autre.
///
public record ChangementStatut
{
/// null retire le statut : le livre redevient « non commencé » pour l'appelant.
public Statut? Statut { get; set; }
}