using UnityEngine;

namespace Unity.VisualScripting
{
#if MODULE_PHYSICS_EXISTS
    [UnitCategory("Events/Physics")]
    public abstract class CollisionEventUnit : GameObjectEventUnit<Collision>
    {
        /// <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 total impulse applied to this contact pair to resolve the collision.
        /// </summary>
        [DoNotSerialize]
        public ValueOutput impulse { get; private set; }

        /// <summary>
        /// The relative linear velocity of the two colliding objects.
        /// </summary>
        [DoNotSerialize]
        public ValueOutput relativeVelocity { 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<Collider>(nameof(collider));
            contacts = ValueOutput<ContactPoint[]>(nameof(contacts));
            impulse = ValueOutput<Vector3>(nameof(impulse));
            relativeVelocity = ValueOutput<Vector3>(nameof(relativeVelocity));
            data = ValueOutput<Collision>(nameof(data));
        }

        protected override void AssignArguments(Flow flow, Collision collision)
        {
            flow.SetValue(collider, collision.collider);
            flow.SetValue(contacts, collision.contacts);
            flow.SetValue(impulse, collision.impulse);
            flow.SetValue(relativeVelocity, collision.relativeVelocity);
            flow.SetValue(data, collision);
        }
    }
#endif
}