using Beam.Abstractions;

namespace Beam.Dynamic {
    public class NumberedStateChanger(NumberedStateChanger.MoveState moveState) : IStateChangeBehaviour {
        public delegate void MoveState(IState state, int amount);
        public MoveState MoveStateDlgte { get; set; } = moveState;

        public virtual void Apply(IState state, object stimulus) {
            if (stimulus is not int amount)
                throw new ArgumentException(string.Format(Exceptions.Exceptions.num_state_changer_stimulus_must_be_int, stimulus.GetType().Name), nameof(stimulus));
            Apply(state, amount);
        }

        public virtual void Apply(IState state, int amount) {
            MoveStateDlgte(state, amount);
        }

        public NumberedStateChanger(IStateChangeBehaviour behavior) : this((x, i) => {
            behavior.Apply(x, i);
        }) {}
    }
}
