/**
 * Copyright(c) Live2D Inc. All rights reserved.
 *
 * Use of this source code is governed by the Live2D Open Software license
 * that can be found at https://www.live2d.com/eula/live2d-open-software-license-agreement_en.html.
 */
using UnityEngine;
using UnityEngine.Animations;
using UnityEngine.Playables;
namespace Live2D.Cubism.Framework.Motion
{
    /// 
    /// Cubism motion state.
    /// 
    public class CubismMotionState
    {
        #region Variable
        /// 
        /// Cubism motion state clip.
        /// 
        public AnimationClip Clip { get; private set; }
        /// 
        /// Animation clip mixer.
        /// 
        public AnimationMixerPlayable ClipMixer { get; private set; }
        /// 
        /// Animation clip playable.
        /// 
        public AnimationClipPlayable ClipPlayable { get; private set; }
        #endregion
        /// 
        /// Create motion state.
        /// 
        /// Playable graph.
        /// Animation clip.
        /// Animation is loop.
        /// Animation speed.
        public static CubismMotionState CreateCubismMotionState(PlayableGraph playableGraph, AnimationClip clip, bool isLoop = true, float speed = 1.0f)
        {
            var ret = new CubismMotionState();
            ret.Clip = clip;
            // Create animation clip mixer.
            ret.ClipMixer = AnimationMixerPlayable.Create(playableGraph, 2);
            ret.ClipMixer.SetSpeed(speed);
            // Connect AnimationClip Playable
            ret.ClipPlayable = AnimationClipPlayable.Create(playableGraph, ret.Clip);
            if(!isLoop)
            {
                ret.ClipPlayable.SetDuration(clip.length - 0.0001f);
            }
            ret.ClipMixer.ConnectInput(0, ret.ClipPlayable, 0);
            ret.ClipMixer.SetInputWeight(0, 1.0f);
            return ret;
        }
        /// 
        /// Connect motion state clip mixer.
        /// 
        /// .
        public void ConnectClipMixer(AnimationMixerPlayable clipMixer)
        {
            var lastInput = ClipMixer.GetInputCount() - 1;
#if UNITY_2018_2_OR_NEWER
            ClipMixer.DisconnectInput(lastInput);
#else
            ClipMixer.GetGraph().Disconnect(ClipMixer, lastInput);
#endif
            ClipMixer.ConnectInput(lastInput, clipMixer, 0);
            ClipMixer.SetInputWeight(lastInput, 1.0f);
        }
    }
}