// FlexiMotion // https://kybernetik.com.au/flexi-motion // Copyright 2023-2025 Kybernetik //

#pragma warning disable CS0649 // Field is never assigned to, and will always have its default value.

using Unity.Jobs;
using UnityEngine;

namespace FlexiMotion.Modifiers
{
    /// <summary>
    /// An <see cref="AccelerationModifier"/> which randomizes its <see cref="AccelerationModifier.Acceleration"/>
    /// every frame and can apply temporary gusts.
    /// </summary>
    /// https://kybernetik.com.au/flexi-motion/api/FlexiMotion.Modifiers/WindModifier
    /// 
    [AddComponentMenu(FMStrings.ModifiersMenuPrefix + "Wind Modifier")]
    [HelpURL(FMStrings.DocsURLs.ModifiersAPIDocumentation + "/" + nameof(WindModifier))]
    public class WindModifier : AccelerationModifier
    {
        /************************************************************************************************************************/

        [SerializeField]
        [Tooltip("A random value of this magnitude will be added to the acceleration each frame.")]
        private float _Randomization;

        /// <summary>A random value of this magnitude will be added to the acceleration each frame.</summary>
        public ref float Randomization => ref _Randomization;

        [SerializeField]
        [Tooltip("Additional acceleration to apply while a gust is active.")]
        private Vector3 _GustAcceleration;

        /// <summary>Additional acceleration to apply while a gust is active.</summary>
        public ref Vector3 GustAcceleration => ref _GustAcceleration;

        [SerializeField]
        [Tooltip("How long a gust lasts (in seconds).")]
        private float _GustDuration = 0.1f;

        /// <summary>How long a gust lasts (in seconds).</summary>
        public ref float GustDuration => ref _GustDuration;

        private float _RemainingGustDuration;

        /************************************************************************************************************************/

        /// <inheritdoc/>
        public override JobHandle OnUpdate(JobHandle dependsOn = default)
        {
            var acceleration = Acceleration;
            acceleration += Random.insideUnitSphere * _Randomization;

            if (_RemainingGustDuration > 0)
            {
                _RemainingGustDuration -= DeltaTime;
                acceleration += _GustAcceleration;
            }

            return ScheduleVelocity(acceleration * Magnitude, dependsOn);
        }

        /************************************************************************************************************************/

        /// <summary>Starts a gust.</summary>
        public void StartGust()
        {
            _RemainingGustDuration = _GustDuration;
        }

        /************************************************************************************************************************/
    }
}

