﻿#if UNITY_EDITOR

using System;
using UnityEngine;
using UnityEditor;

namespace AC.Downloads.FirstPerson2D
{

	public class FirstPerson2DTemplate : Template
	{

		#region Variables

		[SerializeField] private MenuManager menuManager = null;
		[SerializeField] private Texture2D cameraNodeIcon = null;
		[SerializeField] private CameraNode2D cameraNodePrefab = null;

		#endregion


		#region PublicFunctions

		public override bool CanInstall (ref string errorText)
		{
			if (cameraNodePrefab == null)
			{
				errorText = "No CameraNode2D prefab assigned";
				return false;
			}

			if (KickStarter.sceneManager == null)
			{
				errorText = "No Scene Manager assigned";
				return false;
			}

			if (KickStarter.settingsManager == null)
			{
				errorText = "No Settings Manager assigned";
				return false;
			}

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

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

			return true;
		}

		#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.sceneManager, KickStarter.menuManager }, "");

			// Prefab
			CameraNode2D newCameraNodePrefab = CopyAsset<CameraNode2D> (installPath, cameraNodePrefab, ".prefab");
			if (newCameraNodePrefab == null)
			{
				onFail.Invoke ("Prefab copy failed.");
				return;
			}

			// Scene
			KickStarter.sceneManager.AddPrefab (new SceneManagerPrefabData ("Navigation", "Camera node 2D", "A node for navigating the scene in 2D first-person.", cameraNodeIcon, newCameraNodePrefab.gameObject));

			// Settings
			KickStarter.settingsManager.cameraPerspective = CameraPerspective.TwoD;
			AC.KickStarter.settingsManager.movingTurning = MovingTurning.Unity2D;
			KickStarter.settingsManager.movementMethod = MovementMethod.None;
			KickStarter.settingsManager.aspectRatioEnforcement = AspectRatioEnforcement.Fixed;
			AC.KickStarter.settingsManager.wantedAspectRatio = 1.333f;
			EditorUtility.SetDirty (KickStarter.settingsManager);

			// Menu
			CopyMenus (installPath, menuManager, KickStarter.menuManager);

			onComplete.Invoke ();
		}

		#endregion


		#region GetSet

		public override string Label { get { return "2D first-person"; }}
		public override string PreviewText { get { return "Adds the ability to navigate a 2D scene in first person, moving between static background images with discrete arrow clicks."; }}
		public override Type[] AffectedManagerTypes { get { return new Type[] { typeof (SceneManager), typeof (SettingsManager), typeof (MenuManager) }; }}
		public override bool RequiresInstallPath { get { return true; }}
		public override string FolderName { get { return "2D FirstPerson"; }}

		#endregion

	}


	[CustomEditor (typeof (FirstPerson2DTemplate))]
	public class FirstPerson2DTemplateEditor : TemplateEditor
	{}

}

#endif