using Google.Protobuf.WellKnownTypes;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using static System.Formats.Asn1.AsnWriter;

namespace SpaceInvaders
{
    internal class GameEngine
    {
        Game game = new Game();
        public List<(string Name, int Score)> playerScores = new List<(string Name, int Score)>(); //liste contenant le nom et le score
        byte bytLangage = 0; //Numéro de la valeur du texte de la langue
        byte bytMenu = 0; //Numéro de la valeur du texte des paramètres
        byte bytStart = 0; //Numéro de la valeur du texte du début
        byte bytRetourner = 0; //Numéro de la valeur du texte pour aller en arrière
        //byte bytResultats = 0; //Numéro de la valeur du texte des résultats
        public void Start()
        {
            ///////////////////////////////////////////////////////////Déclaration des variabes////////////////////////////////////////
            byte bytPosHMenu = 0;                         //Position horizontale du curseur
            byte bytPosVMenu = 3;                         //Position vertical du curseur
            byte bytPosHLangage = 6;                      //Position horizontale du curseur
            byte bytPosVLangage = 2;                      //Position vertical du curseur
            string[] strStart = new string[] { "[Presser la barre d'espace pour commencer]", "[Press the space bar to start]", "[Presiona espacio para comenzar]" }; //Texte du début       
            string[] strMenu = new string[] { "1.Jouer", "2.Paramètres", "3.Résultats", "4.Quitter", "1.Play", "2.Settings", "3.Results", "4.Leave", "1.Jugar", "2.Ajustes", "3.Resultados", "4.Salir" }; //Texte des paramètres            
            string[] strLangage = new string[] { "Paramètres\n", "Langage du jeu: ", "[Français] ", "[Anglais] ", "[Espagnol]\n", "Settings\n", "Game lenguage: ", "[French] ", "[Inglish] ", "[Spanish]\n", "Ajustes\n", "Idioma del juego: ", "[Francés] ", "[Inglés] ", "[Español]\n" }; //Texte de la langue            
            string[] strRetourner = new string[] { "[Retourner]", "[Return]", "[Volver]" }; //Texte pour aller en arrière
            //string[] strResultats = new string[] { "Meilleurs joueurs ", "Best players ", "Mejores resultados "; //Texte des résultats





            ConsoleKeyInfo key2;
            /////////////////////////////////////////////////Code principale///////////////////////////////////////////////////////////
            do
            {
                do
                {
                    //Affichage du texte
                    SuperConsole.WriteAtPosition(0, 0, "SpicyInvader II");
                    //Affichage du texte
                    SuperConsole.WriteAtPosition(0, 1, "-----------------");
                    //Affichage du texte du début
                    SuperConsole.WriteAtPosition(0, 3, strStart[bytStart]);
                    //Lecture du clavier
                    ConsoleKeyInfo key1 = Console.ReadKey();
                    //Condition de sortie
                    if (key1.Key == ConsoleKey.Spacebar)
                        break;

                    else
                    {
                        Console.Clear();
                    }

                } while (true);


                do
                {

                    //Efface l'écran
                    Console.Clear();
                    //Affichage du texte
                    Console.WriteLine("SpicyInvader II");
                    //Affichage du texte
                    Console.WriteLine("-----------------\n");


                    //Affichage du texte du Menu
                    Console.WriteLine(strMenu[bytMenu]);
                    bytMenu++;
                    Console.WriteLine(strMenu[bytMenu]);
                    bytMenu++;
                    Console.WriteLine(strMenu[bytMenu]);
                    bytMenu++;
                    Console.WriteLine(strMenu[bytMenu]);
                    bytMenu -= 3;
                    //Position horizontale du cursor
                    bytPosHMenu = 0;
                    //Position vertical du cursor
                    bytPosVMenu = 3;
                    //Position du cursor
                    Console.SetCursorPosition(bytPosHMenu, bytPosVMenu);

                    do
                    {

                        var key = Console.ReadKey(true);
                        //Déplacment avec les flèches
                        if (key.Key == ConsoleKey.UpArrow)
                        {
                            if (bytPosVMenu == 3)
                            {
                                bytPosVMenu += 3;
                                Console.SetCursorPosition(bytPosHMenu, bytPosVMenu);
                            }
                            else
                            {
                                bytPosVMenu--;
                                Console.SetCursorPosition(bytPosHMenu, bytPosVMenu);
                            }
                        }
                        //Déplacment avec les flèches
                        if (key.Key == ConsoleKey.DownArrow)
                        {
                            if (bytPosVMenu == 6)
                            {
                                bytPosVMenu -= 3;
                                Console.SetCursorPosition(bytPosHMenu, bytPosVMenu);
                            }
                            else
                            {
                                bytPosVMenu++;
                                Console.SetCursorPosition(bytPosHMenu, bytPosVMenu);
                            }
                        }

                        if (key.Key == ConsoleKey.Enter)
                        {
                            //Jeu
                            if (bytPosVMenu == 3)
                            {
                                Console.Clear();


                                Console.Clear();
                                game.StartGame();
                                Start();


                            }
                            //Langage
                            if (bytPosVMenu == 4)
                            {
                                Console.Clear();
                                Console.WriteLine(strLangage[bytLangage]);
                                bytLangage++;
                                Console.Write(strLangage[bytLangage]);
                                bytLangage++;
                                Console.Write(strLangage[bytLangage]);
                                bytLangage++;
                                Console.Write(strLangage[bytLangage]);
                                bytLangage++;
                                Console.WriteLine(strLangage[bytLangage]);
                                bytLangage -= 4;
                                Console.Write(strRetourner[bytRetourner]);

                                while (true)
                                {
                                    Console.SetCursorPosition(bytPosHLangage, bytPosVLangage);
                                    key2 = Console.ReadKey();
                                    if (key2.Key == ConsoleKey.LeftArrow)
                                    {

                                        if (bytPosHLangage != 6)
                                        {
                                            bytPosHLangage -= 11;
                                            Console.SetCursorPosition(bytPosHLangage, bytPosVLangage);
                                        }

                                    }
                                    if (key2.Key == ConsoleKey.RightArrow)
                                    {
                                        if (bytPosVLangage != 4)
                                        {
                                            if (bytPosHLangage == 39)
                                            {
                                                bytPosHLangage -= 22;
                                                Console.SetCursorPosition(bytPosHLangage, bytPosVLangage);
                                            }
                                            else
                                            {
                                                bytPosHLangage += 11;
                                                Console.SetCursorPosition(bytPosHLangage, bytPosVLangage);
                                            }

                                        }
                                    }

                                    if (key2.Key == ConsoleKey.DownArrow)
                                    {
                                        if (bytPosHLangage == 6)
                                        {
                                            if (bytPosVLangage == 4)
                                            {
                                                bytPosVLangage -= 2;
                                                Console.SetCursorPosition(bytPosHLangage, bytPosVLangage);
                                            }
                                            else
                                            {
                                                bytPosVLangage += 2;
                                                Console.SetCursorPosition(bytPosHLangage, bytPosVLangage);
                                            }
                                        }

                                    }
                                    if (key2.Key == ConsoleKey.UpArrow)
                                    {
                                        if (bytPosHLangage! == 6)
                                        {
                                            if (bytPosVLangage == 2)
                                            {
                                                bytPosVLangage += 2;
                                                Console.SetCursorPosition(bytPosHLangage, bytPosVLangage);
                                            }
                                            else
                                            {
                                                bytPosVLangage -= 2;
                                                Console.SetCursorPosition(bytPosHLangage, bytPosVLangage);
                                            }
                                        }

                                    }
                                    if (key2.Key == ConsoleKey.Enter)
                                    {
                                        if (bytPosVLangage == 4)
                                        {
                                            break;
                                        }
                                        if (bytPosHLangage == 17)
                                        {
                                            Console.Clear();
                                            bytLangage = 0;

                                            bytMenu = 0;
                                            bytStart = 0;
                                            //bytResultats = 0;
                                            bytRetourner = 0;

                                            break;

                                        }
                                        if (bytPosHLangage == 28)
                                        {
                                            Console.Clear();
                                            bytLangage = 5;

                                            bytMenu = 4;
                                            bytStart = 1;
                                            //bytResultats = 6;
                                            bytRetourner = 1;

                                            break;
                                        }
                                        if (bytPosHLangage == 39)
                                        {
                                            Console.Clear();
                                            bytLangage = 10;
                                            bytMenu = 8;
                                            bytStart = 2;
                                            //bytResultats = 12;
                                            bytRetourner = 2;

                                            break;
                                        }

                                    }

                                }
                                if (bytPosVLangage == 4 || bytPosHLangage == 17 || bytPosHLangage == 28 || bytPosHLangage == 39)
                                {
                                    break;
                                }
                            }
                            if (bytPosVMenu == 5)
                            {
                                ConsoleKeyInfo key3;
                                //Résultat
                                do
                                {

                                    Console.Clear();
                                    Results results = new Results(game);
                                    try
                                    {
                                    results.HighScore();

                                    }
                                    catch
                                    {
                                        Console.WriteLine("No data connexion");
                                    }



                                    Console.Write(strRetourner[bytRetourner]);

                                    key3 = Console.ReadKey();
                                    if (key3.Key == ConsoleKey.Enter)
                                    {

                                        break;
                                    }

                                    else
                                    {
                                        Console.Clear();
                                    }

                                } while (true);

                                if (key3.Key == ConsoleKey.Enter)
                                {
                                    bytPosHLangage = 6;
                                    bytPosVLangage = 2;
                                    break;
                                }
                            }
                            if (bytPosVMenu == 6 || bytPosHLangage == 17 || bytPosHLangage == 28 || bytPosHLangage == 39)
                            {
                                Console.Clear();
                                break;
                            }
                        }


                    } while (true);

                    if (bytPosVMenu == 6 || bytPosHLangage == 17 || bytPosHLangage == 28 || bytPosHLangage == 39)
                    {
                        Console.Clear();
                        bytPosHLangage = 6;
                        bytPosVLangage = 2;
                        break;
                    }
                } while (true);

                if (bytPosVMenu == 6)
                {
                    Environment.Exit(0);
                }
            } while (true);



        }
    }
}

