using CoreLibrary;

namespace ConsoleApp
{
    /// <summary>
    /// Classe utilitaire contenant des méthodes pour dessiner des éléments dans la console.
    /// </summary>
    public static class Utils
    {
        // Dictionnaires associant les valeurs des énumérations avec les couleurs de la console
        private readonly static Dictionary<Couleur, ConsoleColor> couleursTerminal = new Dictionary<Couleur, ConsoleColor>()
        {
            {Couleur.NOIR, ConsoleColor.Black },
            {Couleur.BLANC, ConsoleColor.White },
            {Couleur.ROUGE, ConsoleColor.Red },
            {Couleur.VERT, ConsoleColor.Green },
            {Couleur.BLEU, ConsoleColor.Blue },
            {Couleur.JAUNE, ConsoleColor.DarkYellow }
        };

        private readonly static Dictionary<Indicateur, ConsoleColor> indicateursTerminal = new Dictionary<Indicateur, ConsoleColor>()
        {
            {Indicateur.BONNEPLACE, ConsoleColor.Black },
            {Indicateur.BONNECOULEUR, ConsoleColor.White }
        };

        /// <summary>
        /// Dessine le titre du jeu dans la console.
        /// </summary>
        public static void DessinerTitre()
        {
            Console.WriteLine(@"
 __  __            _                     _           _
|  \/  | __ _  ___| |_  ___  _ _  _ __  (_) _ _   __| |
| |\/| |/ _` |(_-<|  _|/ -_)| '_|| '  \ | || ' \ / _` |
|_|  |_|\__,_|/__/ \__|\___||_|  |_|_|_||_||_||_|\__,_|
");
            DessinerSeparateur();
        }

        /// <summary>
        /// Dessine un séparateur dans la console.
        /// </summary>
        public static void DessinerSeparateur()
        {
            Console.WriteLine(@"

───────────────────────────────────────────────────────


            ");
        }

        /// <summary>
        /// Dessine un pion dans la console.
        /// </summary>
        /// <param name="pion">Le pion à dessiner (une couleur ou un indicateur).</param>
        public static void DessinerPion(Enum pion)
        {
            Console.Write(" ");

            // Sélectionne la couleur appropriée en fonction du type de pion (une couleur ou un indicateur)
            Console.ForegroundColor = pion.GetType().Equals(typeof(Couleur)) ?
                couleursTerminal.GetValueOrDefault((Couleur)pion) :
                indicateursTerminal.GetValueOrDefault((Indicateur)pion);

            // Définit la couleur de fond en fonction de la couleur de premier plan
            Console.BackgroundColor = Console.ForegroundColor.Equals(ConsoleColor.Black) ? ConsoleColor.White : ConsoleColor.Black;

            Console.OutputEncoding = System.Text.Encoding.UTF8;
            Console.Write("⬤");

            Console.ResetColor();

            Console.Write(" ");
        }

        /// <summary>
        /// Dessine une ligne de pions sur la console.
        /// </summary>
        /// <param name="ligne">Un tableau d'énumérations représentant les pions à dessiner.</param>
        private static void DessinerLigne(Enum[] ligne)
        {
            foreach(Enum pion in ligne)
                DessinerPion(pion);

            Console.Write("".PadLeft((4 - ligne.Length) * 3));
        }

        /// <summary>
        /// Dessine un plateau de jeu dans la console, affichant les jetons et les indicateurs.
        /// </summary>
        /// <param name="grille">La grille de jeu.</param>
        /// <param name="indicateurs">Les indicateurs associés à chaque ligne.</param>
        public static void DessinerPlateau(IEnumerable<IEnumerable<Jeton?>> grille, IEnumerable<IEnumerable<Indicateur>> indicateurs)
        {
            IEnumerable<Jeton?>[] grilleTableau = grille.ToArray();
            IEnumerable<Indicateur>[] indicateursTableau = indicateurs.ToArray();

            Console.WriteLine("     Codes           Indicateurs   ");
            Console.WriteLine("────────────────   ────────────────");
            Console.WriteLine("│              │   │              │");

            for (int i = 0; i < grille.Count(); ++i)
            {
                Console.Write("│ ");

                DessinerLigne(
                    grilleTableau[i]
                        .Where(jeton => jeton.HasValue)
                        .Select(jeton => (Enum)jeton!.Value.Couleur)
                        .ToArray()
                );

                Console.Write(" │   │ ");

                if (indicateursTableau[i] == null)
                {
                    indicateursTableau[i] = [];
                }

                DessinerLigne(
                    indicateursTableau[i]
                        .Select(indicateur => (Enum)indicateur)
                        .ToArray()
                );

                Console.WriteLine(" │");
            }


            Console.WriteLine("│              │   │              │");
            Console.WriteLine("────────────────   ────────────────");
        }
    }
}
