// Animancer // https://kybernetik.com.au/animancer // Copyright 2018-2024 Kybernetik //

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

using Unity.Collections;
using UnityEngine;
using UnityEngine.Animations;

namespace Animancer.Samples.Jobs
{
    /// <summary>
    /// An sample component that demonstrates how to use <see cref="SimpleLean"/>.
    /// </summary>
    /// 
    /// <remarks>
    /// Since <see cref="SimpleLean"/> is not a <see cref="MonoBehaviour"/> component, we need this script to
    /// demonstrate its use. However, in a real project you might simply integrate the contents of this class into one
    /// of your existing classes.
    /// <para></para>
    /// <strong>Sample:</strong>
    /// <see href="https://kybernetik.com.au/animancer/docs/samples/jobs/lean">
    /// Lean</see>
    /// </remarks>
    /// 
    /// https://kybernetik.com.au/animancer/api/Animancer.Samples.Jobs/SimpleLeanComponent
    /// 
    [AddComponentMenu(Strings.SamplesMenuPrefix + "Jobs - Simple Lean")]
    [AnimancerHelpUrl(typeof(SimpleLeanComponent))]
    public class SimpleLeanComponent : MonoBehaviour
    {
        /************************************************************************************************************************/
        // Initialization.
        /************************************************************************************************************************/

        [SerializeField] private AnimancerComponent _Animancer;
        [SerializeField] private Transform[] _Bones;

        private SimpleLean _Lean;

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

        protected virtual void Awake()
        {
            Debug.Assert(_Bones.Length > 0, "No bones are assigned.", this);
            NativeArray<TransformStreamHandle> boneHandles =
                AnimancerUtilities.ConvertToTransformStreamHandles(_Bones, _Animancer.Animator);
            _Lean = new(_Animancer.Graph, _Axis.forward, boneHandles);
        }

        /************************************************************************************************************************/
        // Usage.
        /************************************************************************************************************************/

        // Set by a UI Slider.
        public float Angle
        {
            get => _Lean.Angle;
            set => _Lean.Angle = value;
        }

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

        [SerializeField]
        private Transform _Axis;

        protected virtual void Update()
        {
            _Lean.Axis = _Axis.forward;
        }

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