using Syntriax.Engine.Core.Abstract;

namespace Syntriax.Engine.Core;

public class StateEnable : IStateEnable
{
    public event IAssignable.UnassignEventHandler? OnUnassigned = null;
    public event IHasEntity.EntityAssignedEventHandler? OnEntityAssigned = null;
    public event IStateEnable.EnabledChangedEventHandler? OnEnabledChanged = null;

    private bool _enabled = true;
    private IEntity _entity = null!;

    public IEntity Entity => _entity;

    public bool Enabled
    {
        get => _enabled;
        set
        {
            if (value == _enabled)
                return;

            bool previousState = _enabled;
            _enabled = value;
            OnEnabledChanged?.Invoke(this, previousState);
        }
    }

    protected virtual void OnAssign(IEntity entity) { }
    public bool Assign(IEntity entity)
    {
        if (_entity is not null && _entity.IsInitialized)
            return false;

        _entity = entity;
        OnAssign(entity);
        OnEntityAssigned?.Invoke(this);
        return true;
    }

    public bool Unassign()
    {
        if (_entity is null)
            return false;

        _entity = null!;
        OnUnassigned?.Invoke(this);
        return true;
    }
}