﻿using System;
using UnityEditor;
using UnityEngine;

namespace FIMSpace.FEditor
{
    [CustomPropertyDrawer(typeof(FPD_SuffixAttribute))]
    public class FPD_Suffix : PropertyDrawer
    {
        FPD_SuffixAttribute Attribute { get { return ((FPD_SuffixAttribute)base.attribute); } }

        public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)
        {
            label = EditorGUI.BeginProperty(position, label, property);
            position = EditorGUI.PrefixLabel(position, GUIUtility.GetControlID(FocusType.Passive), label);

            float sliderVal = property.floatValue;

            GUIContent suff = new GUIContent(Attribute.Suffix);
            Vector2 fieldS = EditorStyles.label.CalcSize(suff);

            float fieldSize = 34 + fieldS.x + Attribute.widerField;
            var percField = new Rect(position.x + position.width - fieldSize + 5, position.y, fieldSize, position.height);
            Rect floatField = position;

            bool editable = Attribute.editableValue;
            if (GUI.enabled == false) editable = false;

            if (editable)
            {
                floatField = new Rect(position.x + position.width - fieldSize + 2, position.y, fieldSize - (fieldS.x + 4), position.height);
                percField.position = new Vector2(position.x + position.width - fieldS.x, percField.position.y);
                percField.width = fieldS.x;
            }

            position.width -= fieldSize + 3;
            sliderVal = GUI.HorizontalSlider(position, property.floatValue, Attribute.Min, Attribute.Max);

            float pre, value;
            int indent;

            indent = EditorGUI.indentLevel;
            EditorGUI.indentLevel = 0;

            switch (Attribute.Mode)
            {
                case FPD_SuffixAttribute.SuffixMode.From0to100:

                    if (!editable)
                        EditorGUI.LabelField(percField, Mathf.Round(sliderVal / Attribute.Max * 100f).ToString() + Attribute.Suffix);
                    else
                    {
                        pre = Mathf.Round(sliderVal / Attribute.Max * 100f);
                        value = EditorGUI.FloatField(floatField, Mathf.Round(sliderVal / Attribute.Max * 100f));
                        if (value != pre) sliderVal = value / 100f;

                        EditorGUI.LabelField(percField, Attribute.Suffix);
                    }

                    break;

                case FPD_SuffixAttribute.SuffixMode.PercentageUnclamped:

                    if (!editable)
                        EditorGUI.LabelField(percField, Mathf.Round(sliderVal * 100f).ToString() + Attribute.Suffix);
                    else
                    {
                        pre = Mathf.Round(sliderVal * 100f);
                        value = EditorGUI.FloatField(floatField, Mathf.Round(sliderVal * 100f));
                        if (value != pre) sliderVal = value / 100f;

                        EditorGUI.LabelField(percField, Attribute.Suffix);
                    }

                    break;


                case FPD_SuffixAttribute.SuffixMode.FromMinToMax:

                    pre = sliderVal;
                    value = EditorGUI.FloatField(floatField, sliderVal);
                    if (value != pre) sliderVal = value;

                    EditorGUI.LabelField(percField, Attribute.Suffix);

                    break;

                case FPD_SuffixAttribute.SuffixMode.FromMinToMaxRounded:

                    pre = Mathf.Round(sliderVal);
                    value = EditorGUI.FloatField(floatField, Mathf.Round(sliderVal));
                    if (value != pre) sliderVal = value;

                    EditorGUI.LabelField(percField, Attribute.Suffix);

                    break;
            }

            property.floatValue = sliderVal;
            EditorGUI.indentLevel = indent;

            EditorGUI.EndProperty();

        }
    }

}

