using MaBibli.Shared.Dtos;
using MaBibli.Shared.Textes;

namespace MaBibli.Tests;

/// <summary>
/// Découpage des champs qui portent plusieurs valeurs : thèmes d'un livre, articles à la une
/// d'un numéro (lot O2).
/// </summary>
public class ListeSaisieTests
{
    /// <summary>
    /// ⚠️ Le cas qui a tranché le séparateur : un titre d'article contient souvent une virgule,
    /// et elle le couperait en deux.
    /// </summary>
    [Fact]
    public void Un_titre_darticle_garde_ses_virgules()
    {
        var articles = ListeSaisie.Decouper(
            "Ukraine, deux ans après ; Le retour du train de nuit", virguleAussi: false);

        Assert.Equal(["Ukraine, deux ans après", "Le retour du train de nuit"], articles);
    }

    /// <summary>
    /// Les thèmes acceptent la virgule en repli : elle était le séparateur jusqu'au 2026-08-21,
    /// et un thème n'en contient jamais.
    /// </summary>
    [Fact]
    public void Un_theme_se_saisit_aux_deux_separateurs()
    {
        Assert.Equal(
            ["Fantasy", "aventure", "space opera"],
            EnregistrementLivre.DecouperThemes("Fantasy ; aventure, space opera"));
    }

    [Fact]
    public void Le_premier_libelle_tape_est_celui_qui_reste()
    {
        // « Fantasy » et « fantasy » sont la même étiquette au sens de la normalisation.
        Assert.Equal(["Fantasy"], EnregistrementLivre.DecouperThemes("Fantasy ; fantasy ; FANTASY"));
    }

    [Fact]
    public void Les_entrees_vides_disparaissent()
    {
        Assert.Empty(ListeSaisie.Decouper(" ;  ; ", virguleAussi: false));
        Assert.Empty(ListeSaisie.Decouper(null, virguleAussi: true));
    }

    /// <summary>La ligne recomposée se redécoupe à l'identique : c'est ce que fait le formulaire.</summary>
    [Fact]
    public void Joindre_puis_decouper_ne_perd_rien()
    {
        List<string> articles = ["Ukraine, deux ans après", "Le retour du train de nuit"];

        Assert.Equal(articles, ListeSaisie.Decouper(ListeSaisie.Joindre(articles), virguleAussi: false));
    }
}
