/// Credit Ben MacKinnon @Dover8
/// Sourced from - https://github.com/Dover8/Unity-UI-Extensions/tree/range-slider
/// Usage: Extension of the standard slider. Two handles determine a low and high value between a Min and Max. 
/// Raises a UnityEvent passing the low and high values

using UnityEditor;
using UnityEditor.UI;

namespace UnityEngine.UI.Extensions
{
    [CustomEditor(typeof(RangeSlider), true)]
    [CanEditMultipleObjects]
    public class RangeSliderEditor : SelectableEditor
    {
        SerializedProperty m_LowHandleRect;
        SerializedProperty m_HighHandleRect;
        SerializedProperty m_FillRect;

        SerializedProperty m_MinValue;
        SerializedProperty m_MaxValue;
        SerializedProperty m_WholeNumbers;

        SerializedProperty m_LowValue;
        SerializedProperty m_HighValue;

        //need ref values for the editor MinMaxSlider
        float low = 0;
        float high = 1;

        SerializedProperty m_OnValueChanged;


        protected override void OnEnable()
        {
            base.OnEnable();
            m_LowHandleRect = serializedObject.FindProperty("m_LowHandleRect");
            m_HighHandleRect = serializedObject.FindProperty("m_HighHandleRect");
            m_FillRect = serializedObject.FindProperty("m_FillRect");

            m_MinValue = serializedObject.FindProperty("m_MinValue");
            m_MaxValue = serializedObject.FindProperty("m_MaxValue");
            m_WholeNumbers = serializedObject.FindProperty("m_WholeNumbers");

            m_LowValue = serializedObject.FindProperty("m_LowValue");
            low = m_LowValue.floatValue;
            m_HighValue = serializedObject.FindProperty("m_HighValue");
            high = m_HighValue.floatValue;

            m_OnValueChanged = serializedObject.FindProperty("m_OnValueChanged");
        }

        public override void OnInspectorGUI()
        {
            base.OnInspectorGUI();
            EditorGUILayout.Space();

            serializedObject.Update();
            //grab the updated value affected by m_WholeNumbers
            low = m_LowValue.floatValue;
            high = m_HighValue.floatValue;

            EditorGUILayout.PropertyField(m_LowHandleRect);
            EditorGUILayout.PropertyField(m_HighHandleRect);
            EditorGUILayout.PropertyField(m_FillRect);

            if (m_LowHandleRect.objectReferenceValue != null && m_HighHandleRect.objectReferenceValue != null)
            {
                EditorGUI.BeginChangeCheck();

                EditorGUILayout.PropertyField(m_MinValue);
                EditorGUILayout.PropertyField(m_MaxValue);
                EditorGUILayout.PropertyField(m_WholeNumbers);

                //We're going to do a fair bit of layout here
                EditorGUILayout.BeginHorizontal();
                //Low Label and value
                EditorGUILayout.BeginVertical();
                EditorGUILayout.BeginHorizontal();
                GUILayout.FlexibleSpace();
                GUILayout.Label("Low");
                GUILayout.FlexibleSpace();
                EditorGUILayout.EndHorizontal();
                low = EditorGUILayout.DelayedFloatField(low, GUILayout.MaxWidth(100));
                EditorGUILayout.EndVertical();

                GUILayout.FlexibleSpace();

                //Slider
                EditorGUILayout.BeginVertical();
                GUILayout.FlexibleSpace();
                EditorGUILayout.MinMaxSlider(ref low, ref high, m_MinValue.floatValue, m_MaxValue.floatValue, GUILayout.ExpandWidth(true));
                EditorGUILayout.EndVertical();

                GUILayout.FlexibleSpace();

                //High label and value
                EditorGUILayout.BeginVertical();
                EditorGUILayout.BeginHorizontal();
                GUILayout.FlexibleSpace();
                GUILayout.Label("High");
                GUILayout.FlexibleSpace();
                EditorGUILayout.EndHorizontal();
                high = EditorGUILayout.DelayedFloatField(high, GUILayout.MaxWidth(100));
                EditorGUILayout.EndVertical();
                EditorGUILayout.EndHorizontal();

                m_LowValue.floatValue = low;
                m_HighValue.floatValue = high;

                EditorGUILayout.Space();
                EditorGUILayout.PropertyField(m_OnValueChanged);
            }
            else
            {
                EditorGUILayout.HelpBox("Specify a RectTransform for the RangeSlider fill or the RangeSlider handles or both. Each must have a parent RectTransform that it can slide within.", MessageType.Info);
            }

            serializedObject.ApplyModifiedProperties();
        }
    }

}