using System; namespace Engine.Core; public abstract class BaseEntity : IEntity { public Event OnIdChanged { get; } = new(); public Event OnInitialized { get; } = new(); public Event OnFinalized { get; } = new(); public Event OnStateEnableAssigned { get; } = new(); public Event OnUnassigned { get; } = new(); public virtual IStateEnable StateEnable { get; private set; } = null!; public string Id { get; set { if (IsInitialized) throw new($"Can't change {nameof(Id)} of {field} because it's initialized"); if (value == field) return; string previousId = field; field = value; OnIdChanged?.Invoke(this, new(previousId)); } } = string.Empty; public bool IsInitialized { get; private set { if (value == field) return; field = value; if (value) OnInitialized?.Invoke(this); else OnFinalized?.Invoke(this); } } = false; 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; }