using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using uREPL;
using RobocraftX.CommandLine.Custom;

namespace GamecraftModdingAPI.Commands
{
    /// <summary>
    /// Convenient methods for registering commands to Gamecraft.
    /// All methods register to the command line and console block by default.
    /// </summary>
    public static class CommandRegistrationHelper
    {
        public static void Register(string name, Action action, string desc, bool noConsole = false)
        {
            RuntimeCommands.Register(name, action, desc);
            if (noConsole) { return; }
            ConsoleCommands.Register(name, action, desc);
        }

        public static void Register(string name, Action<object> action, string desc, bool noConsole = false)
        {
            Register<object>(name, action, desc, noConsole);
        }

        public static void Register(string name, Action<object, object> action, string desc, bool noConsole = false)
        {
            Register<object, object>(name, action, desc, noConsole);
        }

        public static void Register(string name, Action<object, object, object> action, string desc, bool noConsole = false)
        {
            Register<object, object, object>(name, action, desc, noConsole);
        }

        public static void Register<Param0>(string name, Action<Param0> action, string desc, bool noConsole = false)
        {
            RuntimeCommands.Register<Param0>(name, action, desc);
            if (noConsole) { return; }
            ConsoleCommands.Register<Param0>(name, action, desc);
        }

        public static void Register<Param0, Param1>(string name, Action<Param0, Param1> action, string desc, bool noConsole = false)
        {
            RuntimeCommands.Register<Param0, Param1>(name, action, desc);
            if (noConsole) { return; }
            ConsoleCommands.Register<Param0, Param1>(name, action, desc);
        }

        public static void Register<Param0, Param1, Param2>(string name, Action<Param0, Param1, Param2> action, string desc, bool noConsole = false)
        {
            RuntimeCommands.Register<Param0, Param1, Param2>(name, action, desc);
            if (noConsole) { return; }
            ConsoleCommands.Register<Param0, Param1, Param2>(name, action, desc);
        }

        public static void Unregister(string name, bool noConsole = false)
        {
            RuntimeCommands.Unregister(name);
            if (noConsole) { return; }
            ConsoleCommands.Unregister(name);
        }

        public static void Call(string name)
        {
            RuntimeCommands.Call(name);
        }

        public static void Call<Param0>(string name, Param0 param0)
        {
            RuntimeCommands.Call<Param0>(name, param0);
        }

        public static void Call<Param0, Param1>(string name, Param0 param0, Param1 param1)
        {
            RuntimeCommands.Call<Param0, Param1>(name, param0, param1);
        }

        public static void Call<Param0, Param1, Param2>(string name, Param0 param0, Param1 param1, Param2 param2)
        {
            RuntimeCommands.Call<Param0, Param1, Param2>(name, param0, param1, param2);
        }
    }
}