// source:
// https://forum.unity3d.com/threads/how-to-link-scenes-in-the-inspector.383140/
using UnityEditor;
using UnityEngine;

[CustomPropertyDrawer (typeof (SceneAttribute))]
public class SceneDrawer : PropertyDrawer
{
	public override void OnGUI (Rect position, SerializedProperty property, GUIContent label)
	{
		if (property.propertyType == SerializedPropertyType.String)
		{
			var sceneObject = GetSceneObject(property.stringValue);
			var scene = EditorGUI.ObjectField(position, label, sceneObject, typeof(SceneAsset), true);

			if (scene == null)
			{
				property.stringValue = "";
			}
			else if (scene.name != property.stringValue)
			{
				var sceneObj = GetSceneObject(scene.name);
				if (sceneObj == null)
				{
					Debug.LogWarning("The scene " + scene.name + " cannot be used. To use this scene add it to the build settings for the project");
				}
				else
				{
					property.stringValue = scene.name;
				}
			}
		}
		else
		{
			EditorGUI.LabelField (position, label.text, "Use [Scene] with strings.");
		}
	}

	protected SceneAsset GetSceneObject(string sceneObjectName)
	{
		if (string.IsNullOrEmpty(sceneObjectName))
		{
			return null;
		}

		foreach (var editorScene in EditorBuildSettings.scenes)
		{
			if (editorScene.path.IndexOf(sceneObjectName) != -1)
			{
				return AssetDatabase.LoadAssetAtPath(
					editorScene.path,
					typeof(SceneAsset)
				) as SceneAsset;
			}
		}

		Debug.LogWarning("Scene [" + sceneObjectName + "] cannot be used. Add this scene to the 'Scenes in the Build' in build settings.");

		return null;
	}
}

