// Animancer // https://kybernetik.com.au/animancer // Copyright 2018-2024 Kybernetik //
using System;
using System.Collections.Generic;
using UnityEngine;
namespace Animancer
{
    /// A  based .
    /// 
    /// Documentation:
    /// 
    /// Transition Assets
    /// 
    /// When adding a  to any derived classes, you can use
    ///  and .
    /// 
    /// https://kybernetik.com.au/animancer/api/Animancer/TransitionAssetBase
    [AnimancerHelpUrl(typeof(TransitionAssetBase))]
    public abstract partial class TransitionAssetBase : ScriptableObject,
        ITransition,
        ITransitionDetailed,
        IWrapper,
        IAnimationClipSource
    {
        /************************************************************************************************************************/
        /// The name of the serialized backing field of .
        public const string TransitionField = "_Transition";
        /************************************************************************************************************************/
        /// Returns the  wrapped by this .
        public abstract ITransitionDetailed GetTransition();
        /// 
        object IWrapper.WrappedObject
            => this != null
            ? GetTransition()
            : null;
        /************************************************************************************************************************/
        /// 
        public virtual float FadeDuration => GetTransition().FadeDuration;
        /// 
        public virtual object Key => GetTransition().Key;
        /// 
        public virtual FadeMode FadeMode => GetTransition().FadeMode;
        /// 
        public virtual AnimancerState CreateState() => GetTransition().CreateState();
        /// 
        public virtual void Apply(AnimancerState state)
        {
            GetTransition().Apply(state);
            state.SetDebugName(this);
        }
        /************************************************************************************************************************/
        /// Can this transition create a valid ?
        /// 
        /// Use 
        /// to also null check this reference, i.e: transition.IsValid().
        /// 
        public virtual bool IsValid
            => this != null
            && GetTransition().IsValid();
        /// 
        public bool IsLooping => GetTransition().IsLooping;
        /// 
        public float NormalizedStartTime
        {
            get => GetTransition().NormalizedStartTime;
            set => GetTransition().NormalizedStartTime = value;
        }
        /// 
        public float MaximumDuration => GetTransition().MaximumDuration;
        /// 
        public float Speed
        {
            get => GetTransition().Speed;
            set => GetTransition().Speed = value;
        }
        /************************************************************************************************************************/
        /// []
        /// Calls .
        /// 
        public virtual void GetAnimationClips(List clips)
            => clips.GatherFromSource(GetTransition());
        /************************************************************************************************************************/
#if UNITY_EDITOR
        /// [Editor-Only] Creates an instance of the main non-abstract inheritor of this class.
        /// TransitionAsset sets this to use itself by default.
        public static new Func CreateInstance { get; set; }
#endif
        /************************************************************************************************************************/
    }
}