using System;
using ECOT.Engine;
using ECOT.Game.Buildings;
using ECOT.Game.Interface;

using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;

namespace ECOT.Game.Tools
{
    public class ConstructionTool : Tool
    {
        private City overCity = null;
        private Vector2 slotPos;
        private CityBuilding lastConstructedBuilding = null;

        public CityBuilding LastConstructedBuilding
        {
            get { return this.lastConstructedBuilding; }
        }

        public override void Begin()
        {
            // Change le curseur à l'image du bâtiment à construire
           Building template = GameController.Instance.BuildingFactory.GetBuilding(GameController.Instance.SelectedBuilding.Infos.Name); 

            // Dessine toutes les aires de villes
            GameRenderer.Instance.DrawCityAreas = true;
            // Applique le zoom sur le curseur et change le curseur à l'image du bâtiment sélectionné
            Kernel.Instance.Cursor.ApplyZoom = true;
            Kernel.Instance.Cursor.Sprite = (Sprite)template.FrontSprite.Clone();
#if !XBOX
            Kernel.Instance.Cursor.Sprite.HotSpot = new Vector2(32, 96 - 12);
#else
            Kernel.Instance.Cursor.Sprite.HotSpot = new Vector2(0, 64);
#endif
            Kernel.Instance.Cursor.Color = Color.Red;
        }

        public override void Over(Vector2 position)
        {
#if XBOX
            Kernel.Instance.Cursor.Enable = true;
#endif

            // Vérifie si on se trouve dans l'aire d'une ville disponible
            City city = GameController.Instance.FindNearestCity(position);

            if (this.overCity != null)
                this.overCity.HighlightSlot(this.slotPos, false);

            // Si on se trouve dans l'aire d'une ville ...
            if (city.InArea(position))
            {
                bool available;

                this.overCity = city;
                this.overCity.RenderState.DrawGrid = true;

                Vector2 offset = new Vector2(position.X, position.Y);
                this.slotPos = this.overCity.ToSlot(offset);

                Tile tile = GameController.Instance.Map.Tiles[(int)position.X, (int)position.Y];

                // Vérifie que le tile est constructible, qu'il n'y a pas un batiment déja construit et que l'on a pas atteint la limite de construction du batiment
                Building template = GameController.Instance.BuildingFactory.GetBuilding(GameController.Instance.SelectedBuilding.Infos.Name);
                available = template.CanBuildOn(tile) & city.IsSlotAvailable(slotPos) & GameController.Instance.BuildingFactory.GetBuildingAvailable(template.Infos.Name);

                if (available)
                {
                    city.HighlightSlot(slotPos, true, Color.White);
                    Kernel.Instance.Cursor.Color = Color.GreenYellow;
                }
                else
                {
                    city.HighlightSlot(slotPos, true, Color.Red);
                    Kernel.Instance.Cursor.Color = Color.Red;
                }
            }
            else
            {
                if (this.overCity != null)
                    this.overCity.RenderState.DrawGrid = false;
                this.overCity = null;
                Kernel.Instance.Cursor.Color = Color.Red;
            }
             
        }

        public override void Click(Vector2 position)
        {
            if (this.overCity == null)
            {
                Kernel.Instance.Cursor.Color = Color.Red;
            }
            else
            {
                // Tente d'ajouter le bâtiment
                try
                {
                    Tile tile = GameController.Instance.Map.Tiles[(int)position.X, (int)position.Y];

                    
                    Building template = GameController.Instance.BuildingFactory.GetBuilding(GameController.Instance.SelectedBuilding.Infos.Name);
                    if (!template.CanBuildOn(tile) || !GameController.Instance.BuildingFactory.GetBuildingAvailable(template.Infos.Name))
                        throw new Exception();
                    
                    this.lastConstructedBuilding = GameController.Instance.BuildingFactory.CreateCityBuilding(GameController.Instance.SelectedBuilding.Infos.Name);
                    this.lastConstructedBuilding.Tile = tile;
                    this.overCity.AddBuilding(
                        this.overCity.ToSlot(new Vector2(position.X, position.Y)),
                        this.lastConstructedBuilding);

                 
                    // Sélectionne le bâtiment
                    if (GameController.Instance.OldSelectedItem != null)
                        GameController.Instance.OldSelectedItem.Blur();

                    GameController.Instance.CurrentSelectedItem = this.lastConstructedBuilding;
                    // Dans le GameController, on affecte d'abord CurrentSelectedItem à OldSelectedItem
                    // avant d'affecter lastConstructedBuilding à CurrentSelecteItem, 
                    // Cette seconde ligne affecte donc le bon OldSelectedItem.
                    GameController.Instance.CurrentSelectedItem = this.lastConstructedBuilding;
                    this.lastConstructedBuilding.Focus();

                    // Change l'outil en outil de sélection
                    // The cursor doesn't change when we build a building. So we can build some of the same building with less 'clics'.
                    // GameController.Instance.CurrentTool = ToolType.Selection;

                    // Cache l'aire d'influence de toutes les villes
                    // GameRenderer.Instance.DrawCityAreas = false;
                }
                catch
                {
                    GameRenderer.Instance.TextureBuildingInConstruction = false;
                }
            }
        }

        public override void End()
        {
            // Ne dessine plus toutes les aires de villes
            GameRenderer.Instance.DrawCityAreas = false;
            // Ne dessine plus la grille de la ville survollée
            if (this.overCity != null)
                this.overCity.RenderState.DrawGrid = false;
        }

        #region Properties
        public override ToolType Type
        {
            get { return ToolType.Construction; }
        }
        #endregion
    }
}
