/
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 Arthea.Connections.Players;
using Arthea.Continents;
using Arthea.Continents.Areas;
using Arthea.Environment;

namespace Arthea.Commands.Admin
{
    /// <summary>
    /// Implementation of a edit command.
    /// </summary>
    public class EditCommand : Command
    {
        #region [rgn] Constructors (1)

        /// <summary>
        /// Initializes a new instance of the <see cref="EditCommand"/> class.
        /// </summary>
        public EditCommand() : base("edit", "Entry point for on-line creation", Levels.Admin)
        {
        }

        #endregion [rgn]

        #region [rgn] Methods (1)

        // [rgn] Public Methods (1)

        /// <summary>
        /// Processes the command for a player.
        /// </summary>
        /// <param name="player">The player.</param>
        /// <param name="argument">The argument.</param>
        public override void Process(Player player, String argument)
        {
            if (argument.Empty())
            {
                Syntax(player, "create <type> [args]", "room [id]", "item <id|name>",
                       "character <id|name>", "area <name>", "continent <name>",
                       "help <keyword>", "social <name>", "script <id>");
                return;
            }

            String arg = argument.FirstArg();

            if (arg == "create")
            {
                new CreateCommand().Process(player, argument);

                return;
            }

            if (arg.IsPrefixOf("room"))
            {
                uint id;

                if (uint.TryParse(argument, out id) && Lists.Rooms.ContainsKey(id))
                {
                    player.Connection.Edit(Lists.Rooms[id]);
                }
                else
                {
                    player.Connection.Edit(player.Room);
                }
            }
            else if (arg.IsPrefixOf("item"))
            {
                uint id;

                if (uint.TryParse(argument, out id) && Lists.ItemIndexes.ContainsKey(id))
                {
                    player.Connection.Edit(Lists.ItemIndexes[id]);
                }
                else
                {
                    player.Connection.Edit(Lists.Items.FindName(argument));
                }
            }
            else if (arg.IsPrefixOf("character"))
            {
                uint id;

                if (!uint.TryParse(argument, out id) || !Lists.CharIndexes.ContainsKey(id))
                {
                    player.Connection.Edit(Lists.Characters.FindName(argument));
                }
                else
                {
                    player.Connection.Edit(Lists.CharIndexes[id]);
                }
            }
            else if (arg.IsPrefixOf("area"))
            {
                Area area = Lists.Areas.FindName(argument);
                if (area == null)
                {
                    area = player.Room.Area;
                }
                player.Connection.Edit(area);
            }
            else if (arg.IsPrefixOf("continent"))
            {
                Continent cont = Lists.Continents.FindName(argument);

                if (cont == null)
                {
                    cont = player.Room.Area.Continent;
                }
                player.Connection.Edit(cont);
            }
            else if (arg.IsPrefixOf("help"))
            {
                player.Connection.Edit(Lists.Helps.FindKeyword(argument));
            }
            else if (arg.IsPrefixOf("social"))
            {
                player.Connection.Edit(Lists.Socials.FindName(argument));
            }
            else if (arg.IsPrefixOf("script"))
            {
                uint id;

                if (uint.TryParse(argument, out id) && Lists.Scripts.ContainsKey(id))
                {
                    player.Connection.Edit(Lists.Scripts[id]);
                }
            }
            else
            {
                Process(player, string.Empty);
                return;
            }

            if (player.Connection.Editing == null)
            {
                player.WriteLine("No such object.");
            }
        }

        #endregion [rgn]
    }
}