using System;

namespace RecrownedAthenaeum.Tools.CommandProcessor.Commands
{
    internal class HelpCommand : EngineCommand
    {
        CommandEngine commandEngine;

        public HelpCommand(CommandEngine commandEngine) : base("help")
        {
            this.commandEngine = commandEngine;
            help = "help [command] [arg]";
        }


        public override void Run(string[] arguments)
        {
            if (arguments != null)
            {
                if (commandEngine.ContainsCommand(arguments[0]))
                {
                    if (arguments.Length < 2) ConsoleUtilities.WriteWrappedLine(commandEngine.GetCommand(arguments[0]).Help(null));
                    for (int i = 1; i < arguments.Length; i++)
                    {
                        ConsoleUtilities.WriteWrappedLine(commandEngine.GetCommand(arguments[0]).Help(arguments[i]));
                    }
                }
                else
                {
                    throw new ArgumentException(arguments[0] + " not a command. Type \"help\" for a list of commands.");
                }
            }
            else
            {
                ConsoleUtilities.WriteWrappedLine("Tools for RecrownedAthenaeum library. Possible commands are as follows:\n");
                foreach (EngineCommand engineCommand in commandEngine.commands)
                {
                    for (int i = 0; i < engineCommand.InvokeStrings.Length; i++)
                    {
                        ConsoleUtilities.WriteWrapped(engineCommand.InvokeStrings[i]);
                        if (i + 1 < engineCommand.InvokeStrings.Length)
                        {
                            ConsoleUtilities.WriteWrapped(", ");
                        }
                    }
                    ConsoleUtilities.WriteWrapped(" : ");
                    ConsoleUtilities.WriteWrapped(engineCommand.Help().Replace("\n", "\n\t"), true);
                    Console.WriteLine("--------");
                }
            }
        }
    }
}
