using System.Collections.Generic;
namespace Engine.Core;
/// 
/// Represents a universe responsible for managing s.
/// 
public interface IUniverse : IEntity, IEnumerable
{
    /// 
    /// Event triggered when  is about to be called called on the .
    /// 
    Event OnPreUpdate { get; }
    /// 
    /// Event triggered when  is called on the .
    /// 
    Event OnUpdate { get; }
    /// 
    /// Event triggered after  is called on the .
    /// 
    Event OnPostUpdate { get; }
    /// 
    /// Event triggered when  is about to be called called on the .
    /// 
    Event OnPreDraw { get; }
    /// 
    /// Event triggered when  is called on the .
    /// 
    Event OnDraw { get; }
    /// 
    /// Event triggered after  is called on the .
    /// 
    Event OnPostDraw { get; }
    /// 
    /// Event triggered when a  is about to be registered to the .
    /// 
    Event OnPreUniverseObjectRegistered { get; }
    /// 
    /// Event triggered when a  is registered to the .
    /// 
    Event OnUniverseObjectRegistered { get; }
    /// 
    /// Event triggered when a  is about to be unregistered from the .
    /// 
    Event OnPreUniverseObjectUnRegistered { get; }
    /// 
    /// Event triggered when a  is unregistered from the .
    /// 
    Event OnUniverseObjectUnRegistered { get; }
    /// 
    /// Event triggered when  is changed on the .
    /// 
    Event OnTimeScaleChanged { get; }
    /// 
    /// Current time scale the  operates on.
    /// 
    float TimeScale { get; set; }
    /// 
    /// Contains time data related to this .
    /// 
    UniverseTime Time { get; }
    /// 
    /// Contains unscaled time data related to this .
    /// 
    UniverseTime UnscaledTime { get; }
    /// 
    /// Gets the root  of the .
    /// 
    IUniverseObject Root { get; }
    /// 
    /// Registers an  to the .
    /// 
    /// The  to register.
    void Register(IUniverseObject universeObject);
    /// 
    /// Instantiates a  of type T with the given arguments and registers it to the .
    /// 
    /// The type of  to instantiate.
    /// Constructor parameters for the given type of .
    /// The instantiated .
    T InstantiateUniverseObject(params object?[]? args) where T : class, IUniverseObject;
    /// 
    /// Removes an  from the .
    /// 
    /// The  to remove.
    void Remove(IUniverseObject universeObject);
    /// 
    /// Updates the  with the given delta time.
    /// 
    /// Delta time.
    void Update(UniverseTime universeTime);
    /// 
    /// Performs operations that should be done to the draw.
    /// 
    void Draw();
    readonly record struct TimeScaleChangedArguments(float PreviousTimeScale);
    readonly record struct UpdateArguments(UniverseTime EngineTime);
    readonly record struct UniverseObjectRegisteredArguments(IUniverseObject UniverseObjectRegistered);
    readonly record struct UniverseObjectUnRegisteredArguments(IUniverseObject UniverseObjectUnregistered);
}