using UnityEngine;

namespace Unity.VisualScripting
{
#if MODULE_PHYSICS_2D_EXISTS
    [UnitCategory("Events/Physics 2D")]
    public abstract class CollisionEvent2DUnit : GameObjectEventUnit<Collision2D>
    {
        /// <summary>
        /// The collider we hit.
        /// </summary>
        [DoNotSerialize]
        public ValueOutput collider { get; private set; }

        /// <summary>
        /// The contact points generated by the physics engine.
        /// </summary>
        [DoNotSerialize]
        public ValueOutput contacts { get; private set; }

        /// <summary>
        /// The relative linear velocity of the two colliding objects.
        /// </summary>
        [DoNotSerialize]
        public ValueOutput relativeVelocity { get; private set; }

        /// <summary>
        /// Whether the collision was enabled or not.
        /// </summary>
        [DoNotSerialize]
        public ValueOutput enabled { get; private set; }

        /// <summary>
        /// The complete collision data object.
        /// </summary>
        [DoNotSerialize]
        public ValueOutput data { get; private set; }

        protected override void Definition()
        {
            base.Definition();
            collider = ValueOutput<Collider2D>(nameof(collider));
            contacts = ValueOutput<ContactPoint2D[]>(nameof(contacts));
            relativeVelocity = ValueOutput<Vector2>(nameof(relativeVelocity));
            enabled = ValueOutput<bool>(nameof(enabled));
            data = ValueOutput<Collision2D>(nameof(data));
        }

        protected override void AssignArguments(Flow flow, Collision2D collisionData)
        {
            flow.SetValue(collider, collisionData.collider);
            flow.SetValue(contacts, collisionData.contacts);
            flow.SetValue(relativeVelocity, collisionData.relativeVelocity);
            flow.SetValue(enabled, collisionData.enabled);
            flow.SetValue(data, collisionData);
        }
    }
#endif
}