﻿using static System.Console;

/* Pour avoir plusieurs monstres sur le niveau, penser à faire une lecture du niveau pour récupérer dans un tableau les positions
 * des 'y'. Compter le nombre de 'y' pour savoir le nombre de tours de boucle à faire pour générer le bon nombre de monstres et
 * les assigner aux bonnes positions. On pourrait aussi éventuellement générer aléatoirement des positions (valides !) sur le niveau
 * et les utiliser pour positionner des monstres de manière à générer des combats relativement aléatoire (positions des monstres invisibles).
 */


namespace Rpg
{
    internal static class Program
    {
        private static Monster MonsterInstance { get; set; }
        private static void Main()
        {
            var board = new Board();
            board.RandomEncounter = board.Rand.Next(20, 30);
            var heroInstance = new Hero("Arkhana", 100, new Position(board), new Weapon("Excalibur", 500));
            //var monstersPopulateInstance = new Monster(positions, board);
            //var randomMonster = Monster.GetMonstersTab();

            var continueToPlay = true;

            // Console.WriteLine(randomMonster.Name + " " + randomMonster.HitPoints + " " + randomMonster.Weapon.Name);
            // var monsterInstance = new Monster("Bahamut", 2000, new Position(board), new Weapon());
            // board.MoveOnBoard(heroInstance.Pos, monsterInstance.Pos);
            // board.MoveOnBoard(heroInstance.Pos, randomMonster.Pos);
            while (continueToPlay)
            {
                // ReSharper disable once ObjectCreationAsStatement
                //var monsterInstance = new Monster(/*new Position(board), board*/);
                MonsterInstance = new Monster(board);
                //var randomMonster = Monster.GetMonstersTab();
                
                //var randomMonster = Monster.GetMonstersTab();
                var flee = true;
                board.MoveOnBoard(heroInstance.Pos);
                //var monstersPos = Position.MonsterPosTab;

                var inventoryInstance = new Inventory();
                // Console.WriteLine("You have encountered " + monsterInstance.Name + " !");

                /*
                    Pour déterminer quel Monstre correspond à quel 'y', il suffit d'établir une relation entre les indexes du tableau rand et ceux du tableau MonsterPosTab.
                    Ainsi, lors de l'appel du combat, on obtient bien le bon monstre qui correspond au bon 'y'.
                */

                WriteLine("You have encountered " + MonsterInstance.MonsterRand.Name + " !");
                /*while ((heroInstance.HitPoints > 0) && (monsterInstance.HitPoints > 0))
                {
                    Turn(heroInstance, monsterInstance, inventoryInstance);
                }*/
                while ((heroInstance.HitPoints > 0) && (MonsterInstance.MonsterRand.HitPoints > 0) && flee)
                {
                    flee = Turn(heroInstance, MonsterInstance.MonsterRand, inventoryInstance);
                }

                if (heroInstance.HitPoints == 0)
                {
                    continueToPlay = false;
                    heroInstance.Defeated();
                    Clear();
                }
                else if (heroInstance.HitPoints != 0 && flee)
                {
                    MonsterInstance.MonsterRand.Defeated();
                    board.NumberOfSteps = 0;
                    board.RandomEncounter = board.Rand.Next(20, 30);
                    //monsterInstance.LstRand.RemoveAt(0);
                    Clear();
                    board.DisplayBoard();
                }
                else
                {
                    board.NumberOfSteps = 0;
                    board.RandomEncounter = board.Rand.Next(20, 30);
                    Clear();
                    board.DisplayBoard();
                }
            }
        }

        private static bool Turn(Hero hero, Monster monster, Inventory inventory)
        {
            var flag = 0;
            var usedItem = true;
            var fled = true;
            WriteLine("What do you want to do ?\nAttack\nUse Item\nFlee");
            var choice = ReadLine();
            if (choice == null) return true;
            switch (choice.ToUpper())
            {
                case "ATTACK":
                    hero.Attack(monster);
                    if (monster.HitPoints > 0)
                        WriteLine(monster.Name + " has " + monster.HitPoints + " HP left !");
                    flag = 0;
                    break;
                case "USE ITEM":
                    WriteLine("Which item do you want to use ?");
                    inventory.DisplayInventory();
                    var item = ReadLine();
                    flag = 0;
                    if (item != null)
                        usedItem = Hero.UseItem(item, inventory, hero, monster);
                    break;
                case "FLEE":
                    Hero.Flee();
                    fled = false;
                    break;
                default:
                    WriteLine("Action unavailable... Please type it again...");
                    flag = 1;
                    break;
            }
            if (flag == 1 || !usedItem) return true;
            if (!fled) return false;
            if (monster.HitPoints <= 0) return true;
            monster.Attack(hero);
            WriteLine(monster.Name + " hits you for " + monster.Weapon.Damage +
                              " points of damage.\nYou have " +
                              hero.HitPoints + "HP left.");
            return true;
        }
    }
}