namespace Syntriax.Engine.Core.Abstract;
///
/// Represents an that can enter and exit a hierarchy within the system.
/// This interface allows for tracking the object's presence in the hierarchy and provides events
/// for notifying when the see enters or exits the hierarchy.
///
public interface IHierarchyObject : IEntity, INameable
{
///
/// Event triggered when the enters the hierarchy.
///
event OnEnteredHierarchyDelegate? OnEnteredHierarchy;
///
/// Event triggered when the exits the hierarchy.
///
event OnExitedHierarchyDelegate? OnExitedHierarchy;
///
/// Gets the associated with this , if any.
///
IGameManager? GameManager { get; }
///
/// Indicates whether the is currently in the hierarchy.
///
bool IsInHierarchy { get; }
///
/// Internal method to handle entering the hierarchy.
/// This should be called by the system to properly manage hierarchy states.
///
/// The game manager that is managing this hierarchy.
///
/// if the successfully entered the hierarchy;
/// if it failed to do so.
///
internal bool EnterHierarchy(IGameManager gameManager);
///
/// Internal method to handle exiting the hierarchy.
/// This should be called by the system to properly manage hierarchy states.
///
///
/// if the successfully exited the hierarchy;
/// if it failed to do so.
///
internal bool ExitHierarchy();
///
/// Delegate type for the event triggered when the enters the hierarchy of a .
///
/// The that entered the hierarchy.
/// The that the has entered it's hierarchy.
delegate void OnEnteredHierarchyDelegate(IHierarchyObject sender, IGameManager gameManager);
///
/// Delegate type for the event triggered when the exits the hierarchy of a .
///
/// The that exited the hierarchy.
/// The that the has exited it's hierarchy.
delegate void OnExitedHierarchyDelegate(IHierarchyObject sender, IGameManager gameManager);
}