using System;
using System.Threading;
using System.Collections.Generic;
using System.Text;

namespace SpaceInvaders
{
    public class game
    {
        // Déclaration des variables pour les éléments du jeu : ennemi, vaisseau et tir
        private List<Enemy> enemies;
        private Ship ship;     //vaisseau du joueur
        private Shot shot;           //projectil tiré par le vaisseau
        public int score = 0;       //score actuel


        // Constructeur qui initialise le vaisseau et l'ennemi
        public game(List<Enemy> ennemis, Ship vaisseau)
        {
            enemies = ennemis;
            ship = vaisseau;

        }
        // Fonction pour démarrer le jeu
        public void StartGame()
        {
            Console.CursorVisible = false;
            bool isGameOver = false;

            while (!isGameOver)
            {
                UpdateGame(); // Met à jour le jeu
                Draw();   // Dessine le jeu à l'écran
                Thread.Sleep(80); // Pause pendant 90ms

                foreach (var ennemy in enemies)
                {
                    if (ship.Y == ennemy.Y)
                    {
                        isGameOver = true;
                        break;
                    }
                    
                }
            }
            Console.Clear();
                    Console.SetCursorPosition(10, 0);
                    Console.BackgroundColor = ConsoleColor.Black;
                    Console.WriteLine("GAME OVER");
                
            
        }

        /// <summary>
        /// Mettre à jour le jeu
        /// </summary>
        private void UpdateGame()
        {

            ManageInput();                  // Gère les entrées de l'utilisateur
            foreach (var ennemy in enemies)
            {
                ennemy.UpdatePosition();     // Met à jour la position de l'ennemi
                ennemy.UpdatePosition();
            }
            UpdateShot();              // Met à jour la position du tir et vérifie les collisions


        }
        /// <summary>
        /// Gère les entrées de l'utilisateur
        /// </summary>
        private void ManageInput()
        {

            // Si une touche est pressée
            while (Console.KeyAvailable)
            {
                ConsoleKeyInfo key = Console.ReadKey(true);
                switch (key.Key)
                {

                    case ConsoleKey.Spacebar:       // Lorsque la barre d'espace est pressée, un tir est initié
                        InitiateProjectile();
                        break;
                    case ConsoleKey.Escape:
                        Menu menu = new Menu();
                        menu.StartMenu();
                        break;
                    case ConsoleKey.A:
                        ship.MoveLeft();
                        break;
                    case ConsoleKey.D:
                        ship.MoveRight();
                        break;
                }
            }


        }
        // Initialise un nouveau tir si aucun tir n'est actuellement actif
        private void InitiateProjectile()
        {
            if (shot == null || !shot.tirOn)
            {
                shot = new Shot(ship.X-4, ship.Y);
                shot.tirOn = true;
            }

        }
        // Met à jour la position du tir et vérifie s'il y a collision
        private void UpdateShot()
        {  
            if (shot != null && shot.tirOn)
            {
                shot.Y--;

                if (shot.Y < 0)
                {
                    shot.tirOn = false;
                }

                foreach (var ennemy in enemies)
                {
                    if (shot.Y == ennemy.Y && shot.X >= ennemy.X && shot.X <= ennemy.X )
                    {
                        score += 1000;
                        shot.tirOn = false;

                      
                        enemies.Remove(ennemy);
                        break;
                    }
                }
            }
        }

        /// <summary>
        ///  // Dessine tous les éléments du jeu sur la console
        /// </summary>
        private void Draw()
        {
            Console.Clear();
            Console.CursorVisible = false;
            for (int y = 0; y < 16; y++)
            {
                for (int x = 0; x < Console.WindowWidth; x++)
                {


                    
                    if (y == ship.Y && x == ship.X)
                    {
                        Console.ForegroundColor = ConsoleColor.DarkMagenta;
                        Console.Write("▲");

                    }
                    else
                    { 
                        bool enemyFound = false;
                        foreach (var ennemy in enemies)
                        {
                        if (x == ennemy.X && y == ennemy.Y)
                        {
                            Console.ForegroundColor = ConsoleColor.DarkRed;
                            Console.Write("■");
                            
                            enemyFound = true;
                            break;
                        }
                        }
                        if (!enemyFound)
                         {
                        Console.Write(" ");
                         }
                    }


                }



            }

            // Si un tir est en cours, dessine le tir
            if (shot != null && shot.tirOn)
            {
                
                Console.SetCursorPosition(shot.X+4, shot.Y);
                Console.Write("|");
                Thread.Sleep(0); // Pause pendant 90ms
            }
            //Afficher le score
            Console.SetCursorPosition(1, 0);
            Console.Write($"Score: {score}");




        }
    }
}