using UnityEngine;
using UnityEditor;
using System.Text.RegularExpressions;
using System;

namespace NaughtyAttributes.Editor
{
	[CustomPropertyDrawer(typeof(ResizableTextAreaAttribute))]
	public class ResizableTextAreaPropertyDrawer : PropertyDrawerBase
	{
		protected override float GetPropertyHeight_Internal(SerializedProperty property, GUIContent label)
		{
			if (property.propertyType == SerializedPropertyType.String)
			{
				float labelHeight = EditorGUIUtility.singleLineHeight;
				float textAreaHeight = GetTextAreaHeight(property.stringValue);
				return labelHeight + textAreaHeight;
			}
			else
			{
				return GetPropertyHeight(property) + GetHelpBoxHeight();
			}
		}

		protected override void OnGUI_Internal(Rect rect, SerializedProperty property, GUIContent label)
		{
			EditorGUI.BeginProperty(rect, label, property);

			if (property.propertyType == SerializedPropertyType.String)
			{
				Rect labelRect = new Rect()
				{
					x = rect.x,
					y = rect.y,
					width = rect.width,
					height = EditorGUIUtility.singleLineHeight
				};

				EditorGUI.LabelField(labelRect, label.text);

				EditorGUI.BeginChangeCheck();

				Rect textAreaRect = new Rect()
				{
					x = labelRect.x,
					y = labelRect.y + EditorGUIUtility.singleLineHeight,
					width = labelRect.width,
					height = GetTextAreaHeight(property.stringValue)
				};

				string textAreaValue = EditorGUI.TextArea(textAreaRect, property.stringValue);

				if (EditorGUI.EndChangeCheck())
				{
					property.stringValue = textAreaValue;
				}
			}
			else
			{
				string message = typeof(ResizableTextAreaAttribute).Name + " can only be used on string fields";
				DrawDefaultPropertyAndHelpBox(rect, property, message, MessageType.Warning);
			}

			EditorGUI.EndProperty();
		}

		private int GetNumberOfLines(string text)
		{
			string content = Regex.Replace(text, @"\r\n|\n\r|\r|\n", Environment.NewLine);
			string[] lines = content.Split(new string[] { Environment.NewLine }, StringSplitOptions.None);
			return lines.Length;
		}

		private float GetTextAreaHeight(string text)
		{
			float height = (EditorGUIUtility.singleLineHeight - 3.0f) * GetNumberOfLines(text) + 3.0f;
			return height;
		}
	}
}