#if UNITY_EDITOR

using System;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;

namespace AC.Downloads.SSHD
{

	[CreateAssetMenu]
	public class ScreenSpaceHotspotDetectionTemplate : Template
	{

		#region Variables

		[SerializeField] private GameObject prefab;
		[SerializeField] private MenuManager menuManager = null;
		private const string EventName = "Spawn SSHD";

		#endregion


		#region PublicFunctions

		public override bool CanInstall (ref string errorText)
		{
			if (KickStarter.settingsManager == null)
			{
				errorText = "No Settings Manager assigned";
				return false;
			}
			
			if (KickStarter.cursorManager == null)
			{
				errorText = "No Cursor Manager assigned";
				return false;
			}
			
			if (KickStarter.menuManager == null)
			{
				errorText = "No Menu Manager assigned";
				return false;
			}

			if (KickStarter.menuManager == menuManager)
			{
				errorText = "Wrong Menu Manager assigned";
				return false;
			}

			return true;
		}


		public override bool CanSuggest (NGWData data)
		{
			return data.CameraPerspective == CameraPerspective.ThreeD && data.MovementMethod == MovementMethod.Direct;
		}


		#endregion


		#region ProtectedFunctions

		protected override void MakeChanges (string installPath, bool canDeleteOldAssets, System.Action onComplete, System.Action<string> onFail)
		{
			Undo.RecordObjects (new UnityEngine.Object[] { KickStarter.settingsManager, KickStarter.menuManager }, "");
			
			KickStarter.settingsManager.hotspotDetection = HotspotDetection.CustomScript;
			KickStarter.settingsManager.seeInteractions = SeeInteractions.ViaScriptOnly;
			KickStarter.settingsManager.cancelInteractions = CancelInteractions.ViaScriptOnly;
			KickStarter.cursorManager.addHotspotPrefix = false;
			EditorUtility.SetDirty(KickStarter.cursorManager);
			
			// Prefab
			GameObject newPrefab = CopyAsset (installPath, prefab, ".prefab");
			if (newPrefab == null)
			{
				onFail.Invoke ("Prefab copy failed.");
				return;
			}
			EditorUtility.SetDirty (newPrefab);

			ActionListAsset spawnPrefabActionList = CreateActionList ("Spawn SSHD", installPath, newPrefab);

			EventBeginGame newEvent = new EventBeginGame (KickStarter.settingsManager.GetNextAvailableEventID (), EventName, spawnPrefabActionList, new int[0]);
			KickStarter.settingsManager.events.Add (newEvent);

			EditorUtility.SetDirty (KickStarter.settingsManager);

			CopyMenus (installPath, menuManager, KickStarter.menuManager, canDeleteOldAssets ? ExistingMenuBehaviour.Delete : ExistingMenuBehaviour.Rename);

			onComplete.Invoke ();
		}

		#endregion
		
		
		#region PrivateFunctions
		
		private ActionListAsset CreateActionList (string assetName, string installPath, GameObject prefabGO)
		{
			List<Action> actions = new List<Action>
			{
				ActionInstantiate.CreateNew_Add (prefabGO),
			};

			ActionListAsset newAsset = ActionListAsset.CreateFromActions (assetName, installPath, actions, ActionListType.RunInBackground);
			return newAsset;
		}

		#endregion


		#region GetSet

		public override string Label { get { return "Screen-space Hotspot detection"; }}
		public override string PreviewText { get { return "Causes Hotspot detection to be based on their position on-screen"; }}
		public override Type[] AffectedManagerTypes { get { return new Type[] { typeof(SettingsManager), typeof(CursorManager), typeof (MenuManager) }; }}
		public override TemplateCategory Category { get { return TemplateCategory.Interface; }}
		public override bool RequiresInstallPath { get { return true; }}
		public override string FolderName { get { return "ScreenSpaceHotspotDetection"; }}

		#endregion

	}


	[CustomEditor (typeof (ScreenSpaceHotspotDetectionTemplate))]
	public class ScreenSpaceHotspotDetectionTemplateEditor : TemplateEditor
	{}

}

#endif