using Syntriax.Engine.Core.Abstract;

namespace Syntriax.Engine.Physics2D.Abstract;

/// <summary>
/// Represents a 2D collider.
/// </summary>
public interface ICollider2D : IBehaviour
{
    /// <summary>
    /// Event triggered when a collision is detected.
    /// </summary>
    event CollisionDetectedEventHandler? OnCollisionDetected;

    /// <summary>
    /// Event triggered when a collision is resolved.
    /// </summary>
    event CollisionResolvedEventHandler? OnCollisionResolved;

    /// <summary>
    /// Event triggered when another <see cref="ICollider2D"/> triggers this <see cref="ICollider2D"/>.
    /// </summary>
    event TriggeredEventHandler? OnTriggered;

    /// <inheritdoc cref="ITransform2D" />
    ITransform2D Transform { get; }

    /// <summary>
    /// The <see cref="IRigidBody2D"/> associated with the <see cref="ICollider2D"/>.
    /// </summary>
    IRigidBody2D? RigidBody2D { get; }

    /// <summary>
    /// The value indicating whether the <see cref="ICollider2D"/> is a trigger.
    /// </summary>
    bool IsTrigger { get; set; }

    /// <summary>
    /// Recalculates <see cref="ICollider2D"/> properties.
    /// </summary>
    void Recalculate();

    void Detect(CollisionDetectionInformation collisionDetectionInformation);
    void Resolve(CollisionDetectionInformation collisionDetectionInformation);
    void Trigger(ICollider2D initiator);

    delegate void CollisionDetectedEventHandler(ICollider2D sender, CollisionDetectionInformation collisionDetectionInformation);
    delegate void CollisionResolvedEventHandler(ICollider2D sender, CollisionDetectionInformation collisionDetectionInformation);
    delegate void TriggeredEventHandler(ICollider2D sender, ICollider2D initiatorCollider);
}