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


namespace ECOT.Game.Buildings
{
    /// <summary>
    /// Usine de bâtiment. Elle sert à créer un bâtiment à partir de son nom. Elle stocke en interne une liste de
    /// "templates" qui sont ensuite clonés pour donner la nouvelle instance du bâtiment.
    /// </summary>
    public class BuildingFactory
    {
        #region Internal

        public class Item
        {
            public Building Building;
            public bool Available;

            public Item(Building building, bool available)
            {
                this.Building = building;
                this.Available = available;
            }
        }

        #endregion

        #region Membres

        /// <summary>
        /// List des templates de bâtiments.
        /// <see cref="BuildingFactory.RegisterTemplate"/>
        /// </summary>
        private List<Item> buildingTemplates = new List<Item>();

        #endregion

        #region Propriétés

        public List<Item> Templates
        {
            get { return this.buildingTemplates; }
            set { this.buildingTemplates = value; }
        }

        #endregion

        #region Méthodes

        /// <summary>
        /// Enregistre un nouveau template de bâtiment.
        /// </summary>
        /// <param name="buildingTemplate">Template de bâtiment.</param>
        public void RegisterTemplate(Building buildingTemplate, bool available)
        {
            this.buildingTemplates.Add(new Item(buildingTemplate, available));
        }

        public bool GetBuildingAvailable(string name)
        {
            foreach (Item item in this.buildingTemplates)
                if (item.Building.Name.Equals(name))
                {
                    return item.Available;
                }

            return false;
        }

        public void SetBuildingAvailable(string name, bool available)
        {
            foreach (Item item in this.buildingTemplates)
                if (item.Building.Name.Equals(name))
                {
                    item.Available = available;
                    return;
                }
        }

        /// <summary>
        /// Crée une nouvelle instance de bâtiment de ville à partir du nom de son template.
        /// </summary>
        /// <param name="name">Nom du template</param>
        /// <returns>Nouvelle instance d'un bâtiment de ville</returns>
        public CityBuilding CreateCityBuilding(string name)
        {
            foreach (Item item in this.buildingTemplates)
                if (item.Building.Name.Equals(name)) return (CityBuilding)item.Building.Clone();
            return null;
        }

        /// <summary>
        /// Récupère juste le template d'un bâtiment en fonction de son nom, utile pour la barre de construction.
        /// </summary>
        /// <param name="name">Nom du template</param>
        /// <returns>Template du bâtiment</returns>
        public Building GetBuilding(string name)
        {
            foreach (Item item in this.buildingTemplates)
                if (item.Building.Name.Equals(name))
                {
                    return item.Building;
                }
            return null;
        }

        /// <summary>
        /// Récupère les templates d'un certaine catégorie de bâtiment.
        /// </summary>
        /// <param name="category">Catégorie de bâtiment</param>
        /// <returns>Tableau des nom de template enregistrés pour cette catégorie</returns>
        public Item[] GetTemplatesByCategory(BuildingCategory category)
        {
            List<Item> items = new List<Item>();
            foreach (Item item in this.buildingTemplates)
            {
                if (item.Building.Category == category)
                    items.Add(item);
            }
            return items.ToArray();
        }

        #endregion
    }
}
