using System.Text.Json.Serialization;
using MaBibli.Shared.Textes;

namespace MaBibli.Shared.Dtos;

/// <summary>
/// Une revue et les numéros qu'on en possède.
/// </summary>
/// <remarks>
/// Comme pour les séries, <b>une seule lecture rend tout</b> : la liste des revues sert aussi
/// le détail de chacune, ce qui donne un unique instantané hors-ligne à tenir à jour.
/// </remarks>
public record RevueDto
{
    public required int Id { get; init; }

    public required string Titre { get; init; }

    /// <summary>ISSN à tiret, quand il est connu. Identifiant de la <b>revue</b>, jamais un ISBN.</summary>
    public string? Issn { get; init; }

    public string? Editeur { get; init; }

    public string? AjoutePar { get; init; }

    /// <summary>Numéros possédés, du plus récent au plus ancien.</summary>
    public IReadOnlyList<NumeroRevueDto> Numeros { get; init; } = [];
}

/// <summary>Un numéro possédé. Recensé seulement : ni prêt, ni statut de lecture.</summary>
public record NumeroRevueDto
{
    public required int Id { get; init; }

    public required string Numero { get; init; }

    public DateTime? DateParution { get; init; }

    public string? Note { get; init; }

    /// <summary>Couverture du numéro, quand une URL a été collée. Aucune source ne la fournit.</summary>
    public string? CoverUrl { get; init; }

    /// <summary>Articles annoncés à la une, dans l'ordre de saisie.</summary>
    public IReadOnlyList<string> Articles { get; init; } = [];
}

/// <summary>Charge utile de création ou de modification d'une revue.</summary>
public record EnregistrementRevue
{
    public string Titre { get; set; } = string.Empty;

    public string? Issn { get; set; }

    public string? Editeur { get; set; }
}

/// <summary>Charge utile d'ajout ou de modification d'un numéro.</summary>
public record AjoutNumeroRevue
{
    /// <summary>Obligatoire : deux numéros sans numéro seraient indiscernables.</summary>
    public string Numero { get; set; } = string.Empty;

    public DateTime? DateParution { get; set; }

    public string? Note { get; set; }

    /// <summary>
    /// URL d'une image de couverture. <b>Aucune source ne peut la fournir</b> — l'ISSN désigne
    /// la revue, pas la parution : elle est collée à la main, ou absente.
    /// </summary>
    public string? CoverUrl { get; set; }

    /// <summary>Articles à la une, dans l'ordre de la couverture.</summary>
    public List<string> Articles { get; set; } = [];

    /// <summary>
    /// Vue « une seule ligne » des <see cref="Articles"/>, pour un champ de saisie simple.
    /// </summary>
    /// <remarks>
    /// ⚠️ Séparateur : le <b>point-virgule</b> seul, contrairement aux thèmes d'un livre. Un
    /// titre d'article contient souvent une virgule (« Ukraine, deux ans après »), qui le
    /// couperait en deux.
    /// </remarks>
    [JsonIgnore]
    public string? ArticlesTexte
    {
        get => Articles.Count == 0 ? null : ListeSaisie.Joindre(Articles);
        set => Articles = ListeSaisie.Decouper(value, virguleAussi: false);
    }
}
