using System;
using System.Reflection;
using System.Linq;

namespace Aurora.Backend.Executors
{
    public abstract class BaseExecutor
    {
        public BaseExecutor()
        {
        }

        public static BaseExecutor CreateExecutor<T>(ExecutorType executorType) where T : BaseExecutor
        {
            MethodInfo method = typeof(T).GetMethod("Create");
            if (method == null)
            {
                throw new InvalidOperationException("Executor must include a 'create' method.");
            }

            return method.Invoke(null, new object[] { executorType }) as BaseExecutor;

            // var types = typeof(T).Assembly.GetTypes();

            // foreach (Type type in types)
            // {
            //     MethodInfo genericMethod = method.MakeGenericMethod(type);
            //     genericMethod.Invoke(null, null); // No target, no arguments
            // }
        }
    }

    public enum ExecutorType
    {
        Server,
        Client
    }
}