using UnityEngine;
#if UNITY_EDITOR
using UnityEditor;
#endif
using System.Reflection;

namespace MoreMountains.Tools
{	
	[System.AttributeUsage(System.AttributeTargets.Field)]
	public class MMInspectorButtonAttribute : PropertyAttribute
	{
		public readonly string MethodName;

		public MMInspectorButtonAttribute(string MethodName)
		{
			this.MethodName = MethodName;
		}
	}

	#if UNITY_EDITOR
	[CustomPropertyDrawer(typeof(MMInspectorButtonAttribute))]
	public class InspectorButtonPropertyDrawer : PropertyDrawer
	{
		private MethodInfo _eventMethodInfo = null;

		public override void OnGUI(Rect position, SerializedProperty prop, GUIContent label)
		{
			MMInspectorButtonAttribute inspectorButtonAttribute = (MMInspectorButtonAttribute)attribute;

			float buttonLength = position.width;
			Rect buttonRect = new Rect(position.x, position.y, buttonLength, position.height);
			GUI.skin.button.alignment = TextAnchor.MiddleLeft;

			if (GUI.Button(buttonRect, inspectorButtonAttribute.MethodName))
			{
				System.Type eventOwnerType = prop.serializedObject.targetObject.GetType();
				string eventName = inspectorButtonAttribute.MethodName;

				if (_eventMethodInfo == null)
				{
					_eventMethodInfo = eventOwnerType.GetMethod(eventName, BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic);
				}

				if (_eventMethodInfo != null)
				{
					_eventMethodInfo.Invoke(prop.serializedObject.targetObject, null);
				}
				else
				{
					Debug.LogWarning(string.Format("InspectorButton: Unable to find method {0} in {1}", eventName, eventOwnerType));
				}
			}
		}
	}
	#endif
}