namespace MaBibli.Shared.Textes;

/// <summary>
/// Découpage d'un champ texte qui porte <b>plusieurs valeurs</b> : thèmes d'un livre, articles
/// à la une d'un numéro de revue.
/// </summary>
/// <remarks>
/// <b>Le séparateur est le point-virgule</b>, comme celui des auteurs
/// (<c>EnregistrementLivre.SeparateurAuteurs</c>) : trois champs voisins du même formulaire ne
/// doivent pas se saisir de trois façons.
/// <para>
/// ⚠️ <b>La virgule n'est acceptée que là où elle ne peut rien couper de travers.</b> Un thème
/// (« dark fantasy ») n'en contient jamais, et l'accepter évite de désapprendre une habitude ;
/// un <b>titre d'article</b> en contient souvent (« Ukraine, deux ans après »), et la virgule y
/// couperait le titre en deux. D'où le paramètre plutôt qu'une règle unique.
/// </para>
/// </remarks>
public static class ListeSaisie
{
    public const char Separateur = ';';

    /// <summary>Recompose la ligne de saisie à partir des valeurs enregistrées.</summary>
    public static string Joindre(IEnumerable<string> valeurs) =>
        string.Join($"{Separateur} ", valeurs);

    /// <summary>
    /// Découpe la saisie, élague, écarte les vides et les <b>doublons au sens de la
    /// normalisation</b> — « Fantasy » et « fantasy » sont la même étiquette, et le premier
    /// libellé tapé est celui qui reste.
    /// </summary>
    public static List<string> Decouper(string? saisie, bool virguleAussi)
    {
        if (string.IsNullOrWhiteSpace(saisie))
        {
            return [];
        }

        char[] separateurs = virguleAussi ? [Separateur, ','] : [Separateur];
        var vus = new HashSet<string>(StringComparer.Ordinal);

        return saisie
            .Split(separateurs, StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries)
            .Where(valeur => vus.Add(NormalisationTexte.Normaliser(valeur)))
            .ToList();
    }
}
