namespace Syntriax.Engine.Core.Abstract;

/// <summary>
/// Indicates the object is an <see cref="IAssignable"/> with an assignable <see cref="IBehaviourController"/> field.
/// </summary>
public interface IHasBehaviourController : IAssignable
{
    /// <summary>
    /// Event triggered when the <see cref="IBehaviourController"/> value has has been assigned a new value.
    /// </summary>
    event BehaviourControllerAssignedEventHandler? OnBehaviourControllerAssigned;

    /// <inheritdoc cref="IBehaviourController" />
    IBehaviourController BehaviourController { get; }

    /// <summary>
    /// Assign a value to the <see cref="IBehaviourController"/> field of this object.
    /// </summary>
    /// <param name="behaviourController">New <see cref="IBehaviourController"/> to assign.</param>
    /// <returns> 
    /// <see cref="true"/>, if the value given assigned successfully assigned, <see cref="false"/> if not.
    /// </returns>
    bool Assign(IBehaviourController behaviourController);

    delegate void BehaviourControllerAssignedEventHandler(IHasBehaviourController sender);
}