/**
 * 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.Unmanaged;
using Live2D.Cubism.Framework;
using UnityEngine;
namespace Live2D.Cubism.Core
{
    /// 
    /// Single  parameter.
    /// 
    [CubismDontMoveOnReimport]
    public sealed class CubismParameter : MonoBehaviour
    {
        #region Factory Methods
        /// 
        /// Creates drawables for a .
        /// 
        /// Handle to unmanaged model.
        /// Drawables root.
        internal static GameObject CreateParameters(CubismUnmanagedModel unmanagedModel)
        {
            var root = new GameObject("Parameters");
            // Create parameters.
            var unmanagedParameters = unmanagedModel.Parameters;
            var buffer = new CubismParameter[unmanagedParameters.Count];
            for (var i = 0; i < buffer.Length; ++i)
            {
                var proxy = new GameObject();
                buffer[i] = proxy.AddComponent();
                buffer[i].transform.SetParent(root.transform);
                buffer[i].Reset(unmanagedModel, i);
            }
            return root;
        }
        #endregion
        /// 
        /// Unmanaged parameters from unmanaged model.
        /// 
        private CubismUnmanagedParameters UnmanagedParameters { get; set; }
        /// 
        ///  backing field.
        /// 
        [SerializeField, HideInInspector]
        private int _unmanagedIndex = -1;
        /// 
        /// Position in unmanaged arrays.
        /// 
        internal int UnmanagedIndex
        {
            get { return _unmanagedIndex; }
            private set { _unmanagedIndex = value; }
        }
        /// 
        /// Copy of Id.
        /// 
        public string Id
        {
            get
            {
                // Pull data.
                return UnmanagedParameters.Ids[UnmanagedIndex];
            }
        }
        /// 
        /// Minimum value.
        /// 
        public float MinimumValue
        {
            get
            {
                // Pull data.
                return UnmanagedParameters.MinimumValues[UnmanagedIndex];
            }
        }
        /// 
        /// Maximum value.
        /// 
        public float MaximumValue
        {
            get
            {
                // Pull data.
                return UnmanagedParameters.MaximumValues[UnmanagedIndex];
            }
        }
        /// 
        /// Default value.
        /// 
        public float DefaultValue
        {
            get
            {
                // Pull data.
                return UnmanagedParameters.DefaultValues[UnmanagedIndex];
            }
        }
        /// 
        /// Current value.
        /// 
        [SerializeField, HideInInspector]
        public float Value;
        /// 
        /// Revives the instance.
        /// 
        /// Handle to unmanaged model.
        internal void Revive(CubismUnmanagedModel unmanagedModel)
        {
            UnmanagedParameters = unmanagedModel.Parameters;
        }
        /// 
        /// Restores instance to initial state.
        /// 
        /// Handle to unmanaged model.
        /// Position in unmanaged arrays.
        private void Reset(CubismUnmanagedModel unmanagedModel, int unmanagedIndex)
        {
            Revive(unmanagedModel);
            UnmanagedIndex = unmanagedIndex;
            name = Id;
            Value = DefaultValue;
        }
    }
}