/
etc/
lib/
src/Abilities/
src/Abilities/Skills/
src/Abilities/Spells/
src/Abilities/Spells/Enums/
src/Affects/
src/ArtheaConsole/
src/ArtheaConsole/Properties/
src/ArtheaGUI/Properties/
src/Clans/Enums/
src/Commands/Communication/
src/Commands/ItemCommands/
src/Connections/
src/Connections/Colors/
src/Connections/Enums/
src/Connections/Players/
src/Connections/Players/Enums/
src/Continents/
src/Continents/Areas/
src/Continents/Areas/Characters/
src/Continents/Areas/Characters/Enums/
src/Continents/Areas/Items/
src/Continents/Areas/Items/Enums/
src/Continents/Areas/Rooms/
src/Continents/Areas/Rooms/Enums/
src/Continents/Areas/Rooms/Exits/
src/Creation/
src/Creation/Attributes/
src/Creation/Interfaces/
src/Database/
src/Database/Interfaces/
src/Environment/
src/Properties/
src/Scripts/Enums/
src/Scripts/Interfaces/
#region Arthea License

/***********************************************************************
*  Arthea MUD by R. Jennings (2007)      http://arthea.googlecode.com/ *
*  By using this code you comply with the Artistic and GPLv2 Licenses. *
***********************************************************************/

#endregion

using System;
using System.Collections.Generic;
using System.Reflection;

namespace Arthea.Connections.Colors
{
    /// <summary>
    /// Implements a customizable color
    /// </summary>
    public class CustomColor
    {
        #region [rgn] Fields (6)

        private static int count = 0;
        private readonly int ordinal = count++;

        /// <summary>
        /// Color for items in rooms
        /// </summary>
        public static readonly CustomColor Items = new CustomColor();

        /// <summary>
        /// Color for room names
        /// </summary>
        public static readonly CustomColor RoomName = new CustomColor();

        /// <summary>
        /// Color for say command
        /// </summary>
        public static readonly CustomColor Say = new CustomColor();

        /// <summary>
        /// Color for say command text
        /// </summary>
        public static readonly CustomColor SayText = new CustomColor();

        #endregion [rgn]

        #region [rgn] Properties (1)

        /// <summary>
        /// Gets the count.
        /// </summary>
        /// <value>The count.</value>
        public static int Count
        {
            get { return count; }
        }

        #endregion [rgn]

        #region [rgn] Methods (7)

        // [rgn] Public Methods (7)

        /// <summary>
        /// Creates a color array.
        /// </summary>
        /// <returns></returns>
        public static Color[] CreateColorArray()
        {
            Color[] colors = new Color[count];
            colors[Say] = new Color('g');
            colors[SayText] = new Color('G');
            colors[RoomName] = new Color('G');
            colors[Items] = new Color('Y');
            return colors;
        }

        /// <summary>
        /// Gets the name.
        /// </summary>
        /// <param name="color">The color.</param>
        /// <returns>returns the name of the custom color</returns>
        public static string GetName(CustomColor color)
        {
            foreach (FieldInfo fi in typeof (CustomColor).GetFields(BindingFlags.Public | BindingFlags.Static))
            {
                if (fi.FieldType != color.GetType())
                    continue;

                if (fi.GetValue(color) == color)
                    return fi.Name;
            }
            return "unknown";
        }

        /// <summary>
        /// Gets the names.
        /// </summary>
        /// <returns>an array custom color names</returns>
        public static string[] GetNames()
        {
            List<string> names = new List<string>();
            Type type = typeof (CustomColor);

            foreach (FieldInfo fi in type.GetFields(BindingFlags.Public | BindingFlags.Static))
            {
                if (fi.FieldType != type)
                    continue;

                names.Add(fi.Name);
            }
            return names.ToArray();
        }

        /// <summary>
        /// Performs an implicit conversion from <see cref="CustomColor"/> to <see cref="System.Int32"/>.
        /// </summary>
        /// <param name="c">The custom color.</param>
        /// <returns>The result of the conversion.</returns>
        public static implicit operator int(CustomColor c)
        {
            return c.ordinal;
        }

        /// <summary>
        /// Parses the specified word.
        /// </summary>
        /// <param name="word">The word.</param>
        /// <returns>a custom color</returns>
        public static CustomColor Parse(String word)
        {
            Type type = typeof (CustomColor);

            foreach (FieldInfo fi in type.GetFields(BindingFlags.Static | BindingFlags.Public))
            {
                if (fi.FieldType != type)
                    continue;

                if (word.IsPrefixOf(fi.Name))
                    return (CustomColor) fi.GetValue(null);
            }

            return null;
        }

        /// <summary>
        /// Returns a <see cref="T:System.String"></see> that represents the current <see cref="T:System.Object"></see>.
        /// </summary>
        /// <returns>
        /// A <see cref="T:System.String"></see> that represents the current <see cref="T:System.Object"></see>.
        /// </returns>
        public override string ToString()
        {
            return BEGIN + ordinal.ToString() + END;
        }

        /// <summary>
        /// Valids the specified index.
        /// </summary>
        /// <param name="index">The index.</param>
        /// <returns></returns>
        public static bool Valid(int index)
        {
            return (index >= 0 && index < count);
        }

        #endregion [rgn]

        #region Constants (2)

        /// <summary>
        /// Custom color begining escape code
        /// </summary>
        public const char BEGIN = '\x96';

        /// <summary>
        /// Custom color ending escape code
        /// </summary>
        public const char END = '\x97';

        #endregion
    }
}