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

namespace SpaceInvaders
{
    public class jeu
    {
        // Déclaration des variables pour les éléments du jeu : ennemi, vaisseau et tir
        private ennemi _ennemi;
        private vaisseau _vaisseau;
        private tir _tir;
        public int score = 0;

        // Constructeur qui initialise le vaisseau et l'ennemi
        public jeu(ennemi ennemi, vaisseau vaisseau)
        {
            _ennemi = ennemi;
            _vaisseau = vaisseau;

        }
        // Fonction principale pour démarrer le jeu
        public void Start()
        {

            Console.CursorVisible = false;
            while (true)
            {
                Update();
                Draw();
                Thread.Sleep(90); 
            }
        }


        private void Update()
        {

            GérerEntrée();              // Gère les entrées de l'utilisateur
            _ennemi.positionNouvelle();// Met à jour la position de l'ennemi
            MettreAJouerTir();           // Met à jour la position du tir et vérifie les collisions
        

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


            while (Console.KeyAvailable)
            {
                ConsoleKeyInfo key = Console.ReadKey(true);
                switch (key.Key)
                {
                    case ConsoleKey.LeftArrow:
                        _vaisseau.MoveGauche();
                        break;
                    case ConsoleKey.RightArrow:
                        _vaisseau.MoveDroite();
                        break;
                    case ConsoleKey.Spacebar:
                        InitiateProjectile();
                        break;
                    case ConsoleKey.Escape:
                        Menu menu = new Menu();
                        menu.Start();
                        break;
                }
            }


        }
        // Initialise un nouveau tir si aucun tir n'est actuellement actif
        private void InitiateProjectile()
        {
            if (_tir == null || !_tir.tirActivé)
            {
                _tir = new tir(_vaisseau.X + 1, _vaisseau.Y - 1);
                _tir.tirActivé = true;
            }

        }
        // Met à jour la position du tir et vérifie s'il y a collision
        private void MettreAJouerTir()
        {
            if (_tir != null && _tir.tirActivé)
            {
                _tir.Y--; // Mueve el proyectil hacia arriba

                // Comprueba si el proyectil ha salido de la pantalla
                if (_tir.Y < 0)
                {
                    _tir.tirActivé = false;
                }
                if(_tir.Y == _ennemi.Y && _tir.X >= _ennemi.X && _tir.X <= _ennemi.X + 6)
                {
                    score += 1;
                    _tir.tirActivé = false; 
                }


            }
        }

        /// <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 == _vaisseau.Y && x == _vaisseau.X)
                    {
                        Console.ForegroundColor = ConsoleColor.DarkMagenta;
                        Console.Write("▲");

                    }


                    else if (x == _ennemi.X && y == _ennemi.Y)
                    {
                        Console.ForegroundColor = ConsoleColor.DarkRed;
                        Console.Write(" ■ ■ ■");
                        x += 4;

                    }

                    else
                    {
                        Console.Write(" ");
                    }

                }
            }
            if (_tir != null && _tir.tirActivé)
            {
                 Console.SetCursorPosition(_tir.X, _tir.Y);
                Console.Write("|");
            }

            //Afficher le score
            Console.SetCursorPosition(50, 0);  
            Console.Write($"Score: {score}");



        }
    }
}

