// Animancer // https://kybernetik.com.au/animancer // Copyright 2018-2024 Kybernetik //
using System;
using System.Collections.Generic;
using UnityEngine;
namespace Animancer
{
    /// A  which gets its clip from a .
    /// 
    /// 
    /// 
    /// Documentation:
    /// 
    /// Directional Animation Sets
    /// 
    /// Example:
    /// // Leave the Clip field empty in the Inspector and assign its AnimationSet instead.
    /// [SerializeField] private DirectionalClipTransition _Transition;
    /// 
    /// ...
    /// 
    /// // Then you can just call SetDirection and Play it like any other transition.
    /// // All of the transition's details like Fade Duration and Events will be applied to whichever clip is plays.
    /// _Transition.SetDirection(Vector2.right);
    /// _Animancer.Play(_Transition);
    /// 
    /// 
    /// https://kybernetik.com.au/animancer/api/Animancer/DirectionalClipTransition
    /// 
    [Serializable]
    public class DirectionalClipTransition : ClipTransition,
        ICopyable
    {
        /************************************************************************************************************************/
        [SerializeField]
        [Tooltip("The animations which used to determine the " + nameof(Clip))]
        private DirectionalAnimationSet _AnimationSet;
        /// [] 
        /// The  used to determine the .
        /// 
        public ref DirectionalAnimationSet AnimationSet
            => ref _AnimationSet;
        /// 
        public override UnityEngine.Object MainObject
            => _AnimationSet;
        /// The name of the serialized backing field of .
        public const string AnimationSetField = nameof(_AnimationSet);
        /************************************************************************************************************************/
        /// Sets the  from the .
        public void SetDirection(Vector2 direction)
            => Clip = _AnimationSet.GetClip(direction);
        /// Sets the  from the .
        public void SetDirection(int direction)
            => Clip = _AnimationSet.GetClip(direction);
        /// Sets the  from the .
        public void SetDirection(DirectionalAnimationSet.Direction direction)
            => Clip = _AnimationSet.GetClip(direction);
        /// Sets the  from the .
        public void SetDirection(DirectionalAnimationSet8.Direction direction)
            => Clip = _AnimationSet.GetClip((int)direction);
        /************************************************************************************************************************/
        /// 
        public override void GatherAnimationClips(ICollection clips)
        {
            base.GatherAnimationClips(clips);
            clips.GatherFromSource(_AnimationSet);
        }
        /************************************************************************************************************************/
        /// 
        public virtual void CopyFrom(DirectionalClipTransition copyFrom, CloneContext context)
        {
            base.CopyFrom(copyFrom, context);
            if (copyFrom == null)
            {
                _AnimationSet = default;
                return;
            }
            _AnimationSet = copyFrom._AnimationSet;
        }
        /************************************************************************************************************************/
    }
}