using System;
using UnityEngine;

namespace Coffee.UIExtensions
{
    [Serializable]
    public class AnimatableProperty : ISerializationCallbackReceiver
    {
        public enum ShaderPropertyType
        {
            Color,
            Vector,
            Float,
            Range,
            Texture
        }

        [SerializeField] private string m_Name = "";
        [SerializeField] private ShaderPropertyType m_Type = ShaderPropertyType.Vector;
        public int id { get; private set; }

        public ShaderPropertyType type
        {
            get { return m_Type; }
        }

        void ISerializationCallbackReceiver.OnBeforeSerialize()
        {
        }

        void ISerializationCallbackReceiver.OnAfterDeserialize()
        {
            id = Shader.PropertyToID(m_Name);
        }

        public void UpdateMaterialProperties(Material material, MaterialPropertyBlock mpb)
        {
            if (!material.HasProperty(id)) return;

            switch (type)
            {
                case ShaderPropertyType.Color:
                    var color = mpb.GetColor(id);
                    if (color != default)
                    {
                        material.SetColor(id, color);
                    }

                    break;
                case ShaderPropertyType.Vector:
                    var vector = mpb.GetVector(id);
                    if (vector != default)
                    {
                        material.SetVector(id, vector);
                    }

                    break;
                case ShaderPropertyType.Float:
                case ShaderPropertyType.Range:
                    var value = mpb.GetFloat(id);
                    if (!Mathf.Approximately(value, 0))
                    {
                        material.SetFloat(id, value);
                    }

                    break;
                case ShaderPropertyType.Texture:
                    var tex = mpb.GetTexture(id);
                    if (tex != default(Texture))
                    {
                        material.SetTexture(id, tex);
                    }

                    break;
            }
        }
    }
}