using UnityEngine;
using UnityEditor;
using UnityEditorInternal;
using System.Collections;
using System.IO;
using System.Text.RegularExpressions;
using System;

[InitializeOnLoad]
public class EasyTouchWelcomeScreen : EditorWindow {

	private const string VERSION = "5.0.0";
	private const string PLAYMAKERADDONVERSION = "1.0,0";
	private const string SUPPORTURL = "http://www.thehedgehogteam.com/Forum/";
	private const string OFFICIALTOPIC = "http://forum.unity3d.com/threads/released-easy-touch.135192/";
	private const float width = 500;
	private const float height = 440;

	private const string PREFSHOWATSTARTUP = "EasyTouch.ShowWelcomeScreen";

	private static bool showAtStartup;
	private static GUIStyle imgHeader;
	private static bool interfaceInitialized;
	private static Texture supportIcon;
	private static Texture cIcon;
	private static Texture jsIcon;
	private static Texture playmakerIcon;
	private static Texture topicIcon;


	[MenuItem("Tools/Easy Touch/Welcome Screen", false, 0)]
	[MenuItem("Window/Easy Touch/Welcome Screen", false, 0)]
	public static void OpenWelcomeWindow(){
		GetWindow<EasyTouchWelcomeScreen>(true);
	}

	[MenuItem ("Tools/Easy Touch/Folder Structure/Switch to JS", false, 100)]
	public static void JsFolders(){
		// EasyTouch is here
		if (!Directory.Exists(Application.dataPath + "/EasyTouchBundle/EasyTouch/Plugins/")){
			Debug.LogWarning("Folder structure incompatible, did you already switch to JS folder structure, or have you manually changed the folder structure?");
			return;
		}
		
		// Create Structure
		if (!Directory.Exists(Application.dataPath + "/Plugins/"))
			AssetDatabase.CreateFolder("Assets", "Plugins");
		if (!Directory.Exists(Application.dataPath + "/Plugins/EasyTouch"))
			AssetDatabase.CreateFolder("Assets/Plugins", "EasyTouch");
		
		AssetDatabase.MoveAsset("Assets/EasyTouchBundle/EasyTouch/Plugins/Components","Assets/Plugins/EasyTouch/Components");
		AssetDatabase.MoveAsset("Assets/EasyTouchBundle/EasyTouch/Plugins/Engine","Assets/Plugins/EasyTouch/Engine");
		
		// Refresh database
		AssetDatabase.Refresh();
	}
	
	[MenuItem ("Tools/Easy Touch/Folder Structure/Revert to original", false, 200)]
	public static void CFolders(){
		
		if (!Directory.Exists(Application.dataPath + "/Plugins/EasyTouch/")){
			Debug.LogWarning("Folder structure incompatible, are you already using original folder structure, or have you manually changed the folder structure?");
			return;
		}
		
		AssetDatabase.MoveAsset("Assets/Plugins/EasyTouch/Components","Assets/EasyTouchBundle/EasyTouch/Plugins/Components");
		AssetDatabase.MoveAsset("Assets/Plugins/EasyTouch/Engine","Assets/EasyTouchBundle/EasyTouch/Plugins/Engine");
		
		AssetDatabase.DeleteAsset("Assets/Plugins/EasyTouch");
		
		Debug.Log("Project must be reloaded when reverting folder structure.");
		EditorApplication.OpenProject(Application.dataPath.Remove(Application.dataPath.Length - "Assets".Length, "Assets".Length));
	}

	static EasyTouchWelcomeScreen(){
		EditorApplication.playmodeStateChanged -= OnPlayModeChanged;
		EditorApplication.playmodeStateChanged += OnPlayModeChanged;
		
		showAtStartup = EditorPrefs.GetBool(PREFSHOWATSTARTUP, true);
		
		if (showAtStartup){
			EditorApplication.update -= OpenAtStartup;
			EditorApplication.update += OpenAtStartup;
		}
	}

	static void OpenAtStartup(){
		OpenWelcomeWindow();
		EditorApplication.update -= OpenAtStartup;
	}

	static void OnPlayModeChanged(){
		EditorApplication.update -= OpenAtStartup;
		EditorApplication.playmodeStateChanged -= OnPlayModeChanged;
	}
	
	void OnEnable(){
		titleContent = new GUIContent("Welcome To Easy Touch"); 

		maxSize = new Vector2(width, height);
		minSize = maxSize;
	}	

	public void OnGUI(){

		InitInterface();
		GUI.Box(new Rect(0, 0, width, 60), "", imgHeader);
		GUI.Label( new Rect(width-90,45,200,20),new GUIContent("Version : " +VERSION));
		GUILayoutUtility.GetRect(position.width, 64);

		GUILayout.BeginVertical();

		if (Button(playmakerIcon,"Install PlayMaker add-on","Requires PlayMaker 1.8 or higher.")){
			InstallPlayMakerAddOn();
		}

		if (Button(jsIcon,"Switch to JS","Switch Easy Touch folder structure to be used with Java Script.")){
			JsFolders();
		}

		if (Button(cIcon,"Revert to original","Revert Easy Touch folder structure to original (C#).")){
			CFolders();
		}

		if (Button(supportIcon,"Community Forum","You need your invoice number to register, if you are a new user.")){
			Application.OpenURL(SUPPORTURL);
		}

		if (Button(supportIcon,"Official topic","Official topic on Unity Forum.",3)){
			Application.OpenURL(OFFICIALTOPIC);
		}

		bool show = GUILayout.Toggle(showAtStartup, "Show at startup");
		if (show != showAtStartup){
			showAtStartup = show;
			EditorPrefs.SetBool(PREFSHOWATSTARTUP, showAtStartup);
		}

		GUILayout.EndVertical();

	}

	void InitInterface(){

		if (!interfaceInitialized){
			imgHeader = new GUIStyle();
			imgHeader.normal.background = (Texture2D)Resources.Load("EasyTouchWelcome");
			imgHeader.normal.textColor = Color.white;

			supportIcon = (Texture)Resources.Load("btn_Support") as Texture;
			playmakerIcon = (Texture)Resources.Load("btn_PlayMaker") as Texture;
			cIcon = (Texture)Resources.Load("btn_cs") as Texture;
			jsIcon = (Texture)Resources.Load("btn_js") as Texture;

			interfaceInitialized = true;
		}
	}
	
	bool Button(Texture texture, string heading, string body, int space=10){

		GUILayout.BeginHorizontal();
		
		GUILayout.Space(54);
		GUILayout.Box(texture, GUIStyle.none, GUILayout.MaxWidth(48));
		GUILayout.Space(10);
		
		GUILayout.BeginVertical();
		GUILayout.Space(1);
		GUILayout.Label(heading, EditorStyles.boldLabel);
		GUILayout.Label(body);
		GUILayout.EndVertical();
		
		GUILayout.EndHorizontal();
		
		var rect = GUILayoutUtility.GetLastRect();
		EditorGUIUtility.AddCursorRect(rect, MouseCursor.Link);
			
		bool returnValue = false;
		if (Event.current.type == EventType.MouseDown && rect.Contains(Event.current.mousePosition)){
			returnValue = true;
		}
		
		GUILayout.Space(space);

		return returnValue;
	}

	private void InstallPlayMakerAddOn(){
			
		string package = "Assets/EasyTouchBundle/Install/PlayMakerAddOn.unitypackage";
		
		try
		{
			AssetDatabase.ImportPackage(package, true);
		}
		catch (Exception)
		{
			Debug.LogError("Failed to import package: " + package);
			throw;
		}

	}
}
