using UnityEngine.AI;

namespace Unity.VisualScripting
{
#if MODULE_AI_EXISTS
    /// <summary>
    /// Called when the nav mesh agent comes within a certain threshold of its destination.
    /// </summary>
    [UnitCategory("Events/Navigation")]
    public sealed class OnDestinationReached : MachineEventUnit<EmptyEventArgs>
    {
        protected override string hookName => EventHooks.Update;

        /// <summary>
        /// The threshold for the remaining distance.
        /// </summary>
        [DoNotSerialize]
        public ValueInput threshold { get; private set; }

        /// <summary>
        /// Whether the event should only trigger when the path is not partial or invalid.
        /// </summary>
        [DoNotSerialize]
        public ValueInput requireSuccess { get; private set; }

        protected override void Definition()
        {
            base.Definition();

            threshold = ValueInput(nameof(threshold), 0.05f);
            requireSuccess = ValueInput(nameof(requireSuccess), true);
        }

        protected override bool ShouldTrigger(Flow flow, EmptyEventArgs args)
        {
            var navMeshAgent = flow.stack.gameObject.GetComponent<NavMeshAgent>();

            return navMeshAgent != null &&
                navMeshAgent.remainingDistance <= flow.GetValue<float>(threshold) &&
                (navMeshAgent.pathStatus == NavMeshPathStatus.PathComplete || !flow.GetValue<bool>(requireSuccess));
        }
    }
#endif
}