/**
 * 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 Live2D.Cubism.Core;
using UnityEngine;
namespace Live2D.Cubism.Framework.Expression
{
    /// 
    /// The cubism expression data.
    /// 
    [System.Serializable]
    public class CubismPlayingExpression
    {
        #region variable
        /// 
        /// Expression type.
        /// 
        [SerializeField]
        public string Type;
        /// 
        /// Expression fade in time.
        /// 
        [SerializeField]
        public float FadeInTime;
        /// 
        /// Expression fade out time.
        /// 
        [SerializeField]
        public float FadeOutTime;
        /// 
        /// Expression Weight.
        /// 
        [SerializeField, Range(0.0f, 1.0f)]
        public float Weight;
        /// 
        /// Expression user time.
        /// 
        [SerializeField]
        public float ExpressionUserTime;
        /// 
        /// Expression end time.
        /// 
        [SerializeField]
        public float ExpressionEndTime;
        /// 
        /// Expression parameters cache.
        /// 
        [SerializeField]
        public CubismParameter[] Destinations;
        /// 
        /// Expression parameter value.
        /// 
        [SerializeField]
        public float[] Value;
        /// 
        /// Expression parameter blend mode.
        /// 
        [SerializeField]
        public CubismParameterBlendMode[] Blend;
        #endregion
        /// 
        /// Initialize expression data from .
        /// 
        /// model.
        /// Source.
        public static CubismPlayingExpression Create(CubismModel model, CubismExpressionData expressionData)
        {
            // Fail silently...
            if(model == null || expressionData == null)
            {
                return null;
            }
            var ret = new CubismPlayingExpression();
            ret.Type = expressionData.Type;
            ret.FadeInTime = (expressionData.FadeInTime < 0.0f)
                                ? 1.0f
                                : expressionData.FadeInTime;
            ret.FadeOutTime = (expressionData.FadeOutTime < 0.0f)
                                ? 1.0f
                                : expressionData.FadeOutTime;
            ret.Weight = 0.0f;
            ret.ExpressionUserTime = 0.0f;
            ret.ExpressionEndTime = 0.0f;
            var parameterCount = expressionData.Parameters.Length;
            ret.Destinations = new CubismParameter[parameterCount];
            ret.Value = new float[parameterCount];
            ret.Blend = new CubismParameterBlendMode[parameterCount];
            for(var i = 0; i < parameterCount; ++i)
            {
                ret.Destinations[i] = model.Parameters.FindById(expressionData.Parameters[i].Id);
                ret.Value[i] = expressionData.Parameters[i].Value;
                ret.Blend[i] = expressionData.Parameters[i].Blend;
            }
            return ret;
        }
    }
}