using System; namespace Syntriax.Engine.Core; public abstract class BaseEntity : IEntity { public Event OnIdChanged { get; private set; } = new(); public Event OnInitialized { get; private set; } = new(); public Event OnFinalized { get; private set; } = new(); public Event OnStateEnableAssigned { get; private set; } = new(); public Event OnUnassigned { get; private set; } = new(); private IStateEnable _stateEnable = null!; private bool _initialized = false; private string _id = string.Empty; public virtual IStateEnable StateEnable => _stateEnable; public string Id { get => _id; set { if (IsInitialized) throw new($"Can't change {nameof(Id)} of {_id} because it's initialized"); if (value == _id) return; string previousId = _id; _id = value; OnIdChanged?.Invoke(this, previousId); } } public bool IsInitialized { get => _initialized; private set { if (value == _initialized) return; _initialized = value; if (value) OnInitialized?.Invoke(this); else OnFinalized?.Invoke(this); } } protected virtual void OnAssign(IStateEnable stateEnable) { } public bool Assign(IStateEnable stateEnable) { if (IsInitialized) return false; _stateEnable = stateEnable; _stateEnable.Assign(this); OnAssign(stateEnable); OnStateEnableAssigned?.Invoke(this); return true; } protected virtual void UnassignInternal() { } public bool Unassign() { if (IsInitialized) return false; UnassignInternal(); _stateEnable = null!; _stateEnable.Unassign(); OnUnassigned?.Invoke(this); return true; } protected virtual void InitializeInternal() { } public bool Initialize() { if (IsInitialized) return false; _stateEnable ??= Factory.StateEnableFactory.Instantiate(this); InitializeInternal(); IsInitialized = true; return true; } protected virtual void FinalizeInternal() { } public bool Finalize() { if (!IsInitialized) return false; FinalizeInternal(); IsInitialized = false; return true; } protected BaseEntity() => _id = Guid.NewGuid().ToString("D"); protected BaseEntity(string id) => _id = id; }