using System;
using System.Linq;
using System.Threading.Tasks;

using SharedLibraryCore.Objects;

namespace SharedLibraryCore
{
    public class CommandArgument
    {
        public string Name { get; set; }
        public bool Required { get; set; }
    }

    public abstract class Command
    {
        public Command(String commandName, String commandDescription, String commandAlias, Player.Permission requiredPermission, bool requiresTarget, CommandArgument[] param = null)
        { 
            Name = commandName;
            Description = commandDescription;
            Alias = commandAlias;
            Permission = requiredPermission;
            RequiresTarget = requiresTarget;
            Arguments = param ?? new CommandArgument[0];
        }

        //Execute the command
        abstract public Task ExecuteAsync(GameEvent E);

        public String Name { get; private set; }
        public String Description { get; private set; }
        public String Syntax => $"{Utilities.CurrentLocalization.LocalizationIndex["COMMAND_HELP_SYNTAX"]} !{Alias} {String.Join(" ", Arguments.Select(a => $"<{(a.Required ? "" : Utilities.CurrentLocalization.LocalizationIndex["COMMAND_HELP_OPTIONAL"] + " ")}{a.Name}>"))}";
        public String Alias { get; private set; }
        public int RequiredArgumentCount => Arguments.Count(c => c.Required);
        public bool RequiresTarget { get; private set; }
        public Player.Permission Permission { get; private set; }
        public CommandArgument[] Arguments { get; private set; }
    }
}