using Syntriax.Engine.Core.Abstract;
using Syntriax.Engine.Core.Exceptions;

namespace Syntriax.Engine.Core.Factory;

public class StateEnableFactory
{
    public static IStateEnable Instantiate(IEntity entity) => Instantiate<StateEnable>(entity);

    public static T Instantiate<T>(IEntity entity, params object?[]? args) where T : class, IStateEnable
    {
        T stateEnable = TypeFactory.Get<T>(args);

        if (!entity.Assign(stateEnable))
            throw AssignException.From(entity, stateEnable);

        if (!stateEnable.Assign(entity))
            throw AssignException.From(stateEnable, entity);

        return stateEnable;
    }
}