namespace MaBibli.Shared.Dtos;
/// Source d'où proviennent les métadonnées d'un candidat.
public enum SourceMetadonnees
{
/// Catalogue général de la BnF, via son API SRU (Dublin Core).
Bnf = 0,
/// OpenLibrary (Internet Archive), second rideau de la cascade.
OpenLibrary = 1,
}
///
/// Une notice candidate pour un ISBN donné.
///
///
/// Un même ISBN peut correspondre à plusieurs notices (rééditions successives partageant
/// l'ISBN). Décision actée dans CLAUDE.md : on ne choisit pas à la place de l'utilisateur,
/// on lui présente tous les candidats. C'est l'interface (phase 3) qui fera choisir.
///
public record CandidatLivre
{
/// Titre nettoyé de la ponctuation ISBD.
public required string Titre { get; init; }
///
/// Auteurs au format « Prénom Nom », dans l'ordre donné par la source. Peut être vide.
///
///
/// Une liste, et non une chaîne : Introduction to Algorithms en renvoie quatre
/// (Cormen, Leiserson, Rivest, Stein), et les recoller pour les redécouper ensuite ferait
/// perdre la frontière entre « Zola, Émile » et deux auteurs.
///
public IReadOnlyList Auteurs { get; init; } = [];
///
/// Les auteurs sur une ligne, séparés comme les attend un champ de saisie
/// ().
///
public string? Auteur =>
Auteurs.Count == 0
? null
: string.Join($"{EnregistrementLivre.SeparateurAuteurs} ", Auteurs);
public string? Editeur { get; init; }
/// Année de publication telle que fournie par la source (texte : « 1979 », « March 2007 »…).
public string? Annee { get; init; }
/// Code langue tel que fourni par la source (« fre », « eng »…).
public string? Langue { get; init; }
///
/// Nombre de pages lu dans la description matérielle de la notice, quand elle en donne un.
///
///
/// ⚠️ Une proposition, jamais une certitude : la BnF n'expose pas un nombre de pages
/// mais une phrase (dc:format : « 1 vol. (349 p.) », « 30 cm », « 2 disques
/// compacts »). Tout ce que le nettoyage ne comprend pas reste null — mieux vaut un
/// champ vide qu'un chiffre inventé.
///
public int? NombrePages { get; init; }
/// URL de la couverture chez OpenLibrary, toujours renseignée (voir remarques du service).
public string? CoverUrl { get; init; }
public required SourceMetadonnees Source { get; init; }
/// Forme d'ISBN qui a effectivement produit cette notice (13 ou 10 converti).
public string? IsbnInterroge { get; init; }
/// Identifiant chez la source : ark BnF (ark:/12148/cb…) ou clé OpenLibrary (/books/OL…M).
public string? IdentifiantSource { get; init; }
/// URL de consultation de la notice chez la source.
public string? UrlNotice { get; init; }
}