﻿#if UNITY_EDITOR
using UnityEditor;
using UnityEngine;

namespace Boxophobic.StyledGUI
{
    public class StyledLabelGizmo : StyledMonoBehaviour
    {
        public Transform basePosition;
        public Transform labelPosition;

        [Space(10)]
        public Object pingObject;

        public enum LabelAnchor
        {
            Center = 10,
            Left = 20,
            Right = 30,
        }

        [Space(10)]
        public LabelAnchor labelAnchor = LabelAnchor.Center;

        [TextArea]
        public string labelText;

        bool pingable;

        void OnDrawGizmos()
        {
            var styleLabel = new GUIStyle(EditorStyles.whiteLabel)
            {
                richText = true,
                alignment = UnityEngine.TextAnchor.MiddleLeft,
                fontSize = 9,
            };

            if (basePosition == null)
            {
                basePosition = transform;
            }

            if (labelPosition == null)
            {
                labelPosition = transform;
            }

            var label = gameObject.name;

            if (labelText != null && labelText.Length != 0)
            {
                label = labelText;
            }

            var size = styleLabel.CalcSize(new GUIContent(label));
            var offset = 0f;

            if (labelAnchor == LabelAnchor.Right)
            {
                offset = size.x + 6;
            }
            else if (labelAnchor == LabelAnchor.Center)
            {
                offset = (size.x + 6) / 2;
            }

            Handles.color = Color.black;
            GUI.color = Color.white;

            Handles.DrawLine(basePosition.position, labelPosition.position);

            Handles.BeginGUI();

            var basePos2D = HandleUtility.WorldToGUIPoint(basePosition.position);
            var labelPos2D = HandleUtility.WorldToGUIPoint(labelPosition.position);

            Handles.DrawSolidRectangleWithOutline(new Rect(labelPos2D.x - offset, labelPos2D.y - 24, size.x + 10, size.y + 10), Color.black, new Color(0, 0, 0, 0));

            if (pingObject != null)
            {
                Event e = Event.current;
                var mousePos = e.mousePosition;

                if (mousePos.x > labelPos2D.x - offset && mousePos.x < labelPos2D.x - offset + size.x + 8 && mousePos.y > labelPos2D.y - 24 && mousePos.y < labelPos2D.y - 24 + size.y + 8)
                {
                    GUI.color = new Color(0.9f, 0.8f, 0.3f, 1f);
                    //GUI.color = new Color(0.0f, 1f, 0.6f, 1f);

                    if (pingable && e.modifiers != EventModifiers.Alt)
                    {
                        EditorGUIUtility.PingObject(pingObject);
                        pingable = false;
                    }

                    //if (e.button == 0 && e.isMouse && e.modifiers != EventModifiers.Alt)
                    //{
                    //    EditorGUIUtility.PingObject(pingObject);
                    //}
                }
                else
                {
                    pingable = true;
                }
            }

            GUI.Label(new Rect(labelPos2D.x + 4 - offset, labelPos2D.y - 20, size.x, size.y), label, styleLabel);

            Handles.EndGUI();
        }
    }
}
#endif