using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using System;
using Holoville.HOTween;

/// <summary>
///  This class is the MainMenu class that contain the logic of the menu
/// Author : Pondomaniac Games
/// </summary>
public class MainMenu : MonoBehaviour {
	public GameObject _Logo;//The animated logos 
	public GameObject _PlayButton;//The play button
	public GameObject _PurchaseButton;//The purchase button
	public GameObject _BestScore;//The bestscore text
	public GameObject _BestLevel;//The level text
	public GameObject _FacebookButton;//The facebook button to connect
	public GameObject _AddCoinsButton;//The button used to add coins

	public GameObject _MoreTimeButton;//The more time button
	public GameObject _LuckButton;//The luck button
	public GameObject _Luckx2Button;//The luck x 2 button
	public GameObject _MoreTimeButtonText;//The more time text
	public GameObject _LuckButtonText;//The luck text
	public GameObject _Luckx2ButtonText;//The luck x 2 text
	private Boolean _IsMoreTime;//More time flag
	private Boolean _IsLuck;//Luck flag
	private Boolean _IsLuckx2;//Luck x 2 flag

	public GameObject _50CoinsButton;//50 Coins
	public GameObject _100CoinsButton;//100 Coins
	public GameObject _200CoinsButton;//200 Coins
	public GameObject _300CoinsButton;//300 Coins

	public GameObject _GoldValue;//Gold value text
	public GameObject _GoldValue2;//Gold value text 2

	public GameObject _TransitionPlayButton;//The small play button 
	public GameObject _TransitionReturnButton;//The return button 
	public GameObject _StoreReturnButton;//The return button to the store
	public GameObject _MainMenuPanel;//The main panel 
	public GameObject _PowerPanel;//The  panel that contains powers
	public GameObject _StorePanel;//The  panel that contains the store
	// Use this for initialization
	//private static List<object>                 friends         = null;//The  list of friends used by the facebook api
	private static Dictionary<string, string>   profile         = null;//The  list of profiles used by the facebook api
	public string _NextScene;//The  nextScene to navigate to 
	public string _Ladder;
	public AudioClip MenuSound;//The  menu sound when the user clicka buton
	public float SpaceBetweenPanels;//The space to keep between panels
	public EaseType AnimationTypeOfPanels;//The animation effect used on the panel
	public float AnimationDurationOfPanels;//The animation duration time
	public bool EnableFacebook;//Specify if we should display facebook buton or not

	//Called before init
void Awake()
	{ Time.timeScale=1; 
		GetGoldValues ();
		_FacebookButton.GetComponent<Renderer>().enabled = false;
		// Initialize FB SDK              
		if (EnableFacebook )FB.Init (SetInit, OnHideUnity);

	}

	void LoginCallback(FBResult result)                                                        
	{                                                                                          
		FbDebug.Log("LoginCallback");                                                          
		
		if (FB.IsLoggedIn)                                                                     
		{                                                                                      
			OnLoggedIn();                                                                      
		}                                                                                      
	}                                                                                          
	
	void OnLoggedIn()                                                                          
	{                                                                                          
		FbDebug.Log("Logged in. ID: " + FB.UserId);
		// Request player info and profile picture                                                                           
		FB.API("/me?fields=id,first_name,friends.limit(100).fields(first_name,id)", Facebook.HttpMethod.GET, APICallback);  
		FB.API(Util.GetPictureURL("me", 128, 128), Facebook.HttpMethod.GET, MyPictureCallback);    

	}           

	private void SetInit()                                                                       
	{                                                                                            
		FbDebug.Log("SetInit");                                                                  
	//	enabled = true; // "enabled" is a property inherited from MonoBehaviour                  
		if (FB.IsLoggedIn)                                                                       
		{                                                                                        
			FbDebug.Log("Already logged in");                                                    
			OnLoggedIn();                                                                        
		}                                                                                        
	}                                                                                            
	
	private void OnHideUnity(bool isGameShown)                                                   
	{                                                                                            
		FbDebug.Log("OnHideUnity");                                                              
		if (!isGameShown)                                                                        
		{                                                                                        
			// pause the game - we will need to hide                                             
			Time.timeScale = 0;                                                                  
		}                                                                                        
		else                                                                                     
		{                                                                                        
			// start the game back up - we're getting focus again                                
			Time.timeScale = 1;                                                                  
		}                                                                                        
	} 



	
	void APICallback(FBResult result)                                                                                              
	{                                                                                                                              
		FbDebug.Log("APICallback");                                                                                                
		if (result.Error != null)                                                                                                  
		{                                                                                                                          
			FbDebug.Error(result.Error);                                                                                           
			// Let's just try again                                                                                                
			FB.API("/me?fields=id,first_name,friends.limit(100).fields(first_name,id)", Facebook.HttpMethod.GET, APICallback);     
			return;                                                                                                                
		}                                                                                                                         
		
		profile = Util.DeserializeJSONProfile(result.Text);                                                                        
		GameStateManager.Username = profile["first_name"];                                                                         
		//friends = Util.DeserializeJSONFriends(result.Text);                                                                        
	}                                                                                                                              
	
	void MyPictureCallback(FBResult result)                                                                                        
	{                                                                                                                              
		FbDebug.Log("MyPictureCallback");                                                                                          
		
		if (result.Error != null)                                                                                                  
		{                                                                                                                          
			FbDebug.Error(result.Error);                                                                                           
			// Let's just try again                                                                                                
			FB.API(Util.GetPictureURL("me", 128, 128), Facebook.HttpMethod.GET, MyPictureCallback);                                
			return;                                                                                                                
		}                                                                                                                          
		GameStateManager.UserTexture = result.Texture;                                                                             
	}    

	//Display facebook button or not
	void OnGUI()
	{

		if (EnableFacebook) {
						if (!FB.IsLoggedIn) {
								_FacebookButton.GetComponent<Renderer>().enabled = true;
						} else {
								_FacebookButton.GetComponent<Renderer>().enabled = false;
						}
						
				}
		}

	//This method is called after the init 
	void Start () {

		PlayerPrefs.SetInt("MoreTime", 0);
		PlayerPrefs.SetInt("Luck", 0);
		PlayerPrefs.SetInt("Luckx2", 0);

		AnimateLogo ();

		(_BestScore.GetComponent (typeof(TextMesh))as TextMesh).text = "" + PlayerPrefs.GetInt ("HighScore");
		(_BestLevel.GetComponent (typeof(TextMesh))as TextMesh).text = "" + PlayerPrefs.GetInt ("HighLevel");
	
	
	}




	// Update is called once per frame
	void Update () {
		if (Input.GetKeyDown(KeyCode.Escape)) { Application.Quit(); }
			//Detecting if the player clicked on the left mouse button and also if there is no animation playing
		if (Input.GetButtonDown ("Fire1") ) {

			//The 3 following lines is to get the clicked GameObject and getting the RaycastHit2D that will help us know the clicked object
			RaycastHit2D hit = Physics2D.Raycast(Camera.main.ScreenToWorldPoint(Input.mousePosition), Vector2.zero);
			if (hit.transform!=null )
			{  if(( hit.transform.gameObject.name ==_FacebookButton.name )  ){  
					Util.ButtonPressAnimation(hit.transform.gameObject);
					  	FB.Login("email,publish_actions", LoginCallback);                                                                                                                                                                 
					  
				}
				else if(( hit.transform.gameObject.name ==_PlayButton.name )  ){GetComponent<AudioSource>().PlayOneShot(MenuSound);Util.ButtonPressAnimation(hit.transform.gameObject); Application.LoadLevel(_NextScene);Time.timeScale=1; }
				else if(( hit.transform.gameObject.name ==_PurchaseButton.name )  ){GetComponent<AudioSource>().PlayOneShot(MenuSound);Util.ButtonPressAnimation(hit.transform.gameObject);TransitToPowerMenu(); }
				else if(( hit.transform.gameObject.name ==_TransitionPlayButton.name )  ){GetComponent<AudioSource>().PlayOneShot(MenuSound); Util.ButtonPressAnimation(hit.transform.gameObject);Application.LoadLevel(_NextScene);Time.timeScale=1; }
				else if(( hit.transform.gameObject.name ==_TransitionReturnButton.name )  ){GetComponent<AudioSource>().PlayOneShot(MenuSound);Util.ButtonPressAnimation(hit.transform.gameObject);TransitMainMenu(); }
				else if(( hit.transform.gameObject.name ==_AddCoinsButton.name )  ){GetComponent<AudioSource>().PlayOneShot(MenuSound); Util.ButtonPressAnimation(hit.transform.gameObject);TransitToStoreMenu(); }
				else if(( hit.transform.gameObject.name ==_StoreReturnButton.name )  ){GetComponent<AudioSource>().PlayOneShot(MenuSound); Util.ButtonPressAnimation(hit.transform.gameObject);TransitToPowerMenu(); }
				else if(( hit.transform.gameObject.name ==_50CoinsButton.name )  ){GetComponent<AudioSource>().PlayOneShot(MenuSound);Util.ButtonPressAnimation(hit.transform.gameObject);IncreaseGoldValue(50); }
				else if(( hit.transform.gameObject.name ==_100CoinsButton.name )  ){GetComponent<AudioSource>().PlayOneShot(MenuSound); Util.ButtonPressAnimation(hit.transform.gameObject);IncreaseGoldValue(100); }
				else if(( hit.transform.gameObject.name ==_200CoinsButton.name )  ){GetComponent<AudioSource>().PlayOneShot(MenuSound); Util.ButtonPressAnimation(hit.transform.gameObject);IncreaseGoldValue(200); }
				else if(( hit.transform.gameObject.name ==_300CoinsButton.name )  ){GetComponent<AudioSource>().PlayOneShot(MenuSound); Util.ButtonPressAnimation(hit.transform.gameObject);IncreaseGoldValue(300); }
				else if(( hit.transform.gameObject.name ==_MoreTimeButton.name ) && DecreaseGoldValue(10) ){GetComponent<AudioSource>().PlayOneShot(MenuSound); Util.ButtonPressAnimation(hit.transform.gameObject);if(! _IsMoreTime  ){ _IsMoreTime = true ;PlayerPrefs.SetInt("MoreTime", 1);  DisableButton(hit.transform.gameObject);DisableButton(_MoreTimeButtonText);}}
				else if(( hit.transform.gameObject.name ==_LuckButton.name)&& DecreaseGoldValue(10)){GetComponent<AudioSource>().PlayOneShot(MenuSound); Util.ButtonPressAnimation(hit.transform.gameObject);if(! _IsLuck  ){_IsLuck = true ;PlayerPrefs.SetInt("Luck", 1);DisableButton(hit.transform.gameObject);DisableButton(_LuckButtonText);}}
				else if(( hit.transform.gameObject.name ==_Luckx2Button.name )&& DecreaseGoldValue(10)  ){GetComponent<AudioSource>().PlayOneShot(MenuSound); Util.ButtonPressAnimation(hit.transform.gameObject);if(! _IsLuckx2 ){_IsLuckx2 = true ;PlayerPrefs.SetInt("Luckx2", 1);DisableButton(hit.transform.gameObject);DisableButton(_Luckx2ButtonText);} }
			

			}}
}

	
	// Transition animation to power panel
	void TransitToPowerMenu() {
		TweenParms parms = new TweenParms().Prop("position", new Vector3(-SpaceBetweenPanels,_MainMenuPanel.transform.position.y,_MainMenuPanel.transform.position.z)).Ease(AnimationTypeOfPanels);
		HOTween.To (_MainMenuPanel.transform, AnimationDurationOfPanels, parms);
		parms = new TweenParms().Prop("position", new Vector3(0,_PowerPanel.transform.position.y,_PowerPanel.transform.position.z)).Ease(AnimationTypeOfPanels);
		HOTween.To(_PowerPanel.transform, AnimationDurationOfPanels, parms);
		parms = new TweenParms().Prop("position", new Vector3(SpaceBetweenPanels,_StorePanel.transform.position.y,_StorePanel.transform.position.z)).Ease(AnimationTypeOfPanels);
		HOTween.To(_StorePanel.transform, AnimationDurationOfPanels, parms);
	}
	// Transition animation to mainmenu panel
	void TransitMainMenu() {
		TweenParms parms = new TweenParms().Prop("position", new Vector3(SpaceBetweenPanels,_PowerPanel.transform.position.y,_PowerPanel.transform.position.z)).Ease(AnimationTypeOfPanels);
		HOTween.To(_PowerPanel.transform, AnimationDurationOfPanels, parms);
		parms = new TweenParms().Prop("position", new Vector3(0,_MainMenuPanel.transform.position.y,_MainMenuPanel.transform.position.z)).Ease(AnimationTypeOfPanels);
		HOTween.To(_MainMenuPanel.transform, AnimationDurationOfPanels, parms);
		parms = new TweenParms().Prop("position", new Vector3(SpaceBetweenPanels*2,_StorePanel.transform.position.y,_StorePanel.transform.position.z)).Ease(AnimationTypeOfPanels);
		HOTween.To(_StorePanel.transform, AnimationDurationOfPanels, parms);
	}
	// Transition animation to store panel
	void TransitToStoreMenu() {
		TweenParms parms = new TweenParms().Prop("position", new Vector3(-SpaceBetweenPanels*2,_StorePanel.transform.position.y,_StorePanel.transform.position.z)).Ease(AnimationTypeOfPanels);
		HOTween.To(_StorePanel.transform, AnimationDurationOfPanels, parms);
		parms = new TweenParms().Prop("position", new Vector3(-SpaceBetweenPanels,_PowerPanel.transform.position.y,_PowerPanel.transform.position.z)).Ease(AnimationTypeOfPanels);
		HOTween.To(_PowerPanel.transform, AnimationDurationOfPanels, parms);
		parms = new TweenParms().Prop("position", new Vector3(0,_StorePanel.transform.position.y,_StorePanel.transform.position.z)).Ease(AnimationTypeOfPanels);
		HOTween.To(_StorePanel.transform, AnimationDurationOfPanels, parms);

	}

	// Disable and disappear a button
	void DisableButton(GameObject go){
		Color oldColor = go.GetComponent<Renderer>().material.color;
			TweenParms parms = new TweenParms().Prop("color", new Color(oldColor.r, oldColor.b, oldColor.g, 0f)).Ease(EaseType.EaseOutQuart);
		HOTween.To(go.GetComponent<Renderer>().material, 1f,parms);

	}

	// Get the gold value to get displayed
	void GetGoldValues()
	{    if (	PlayerPrefs.GetInt ("NotFirstLaunch") !=1 ){
			PlayerPrefs.SetInt("Gold", 100);
			PlayerPrefs.SetInt("NotFirstLaunch", 1);
		}
		(_GoldValue.GetComponent(typeof( TextMesh))as TextMesh).text = PlayerPrefs.GetInt("Gold").ToString();
		(_GoldValue2.GetComponent(typeof( TextMesh))as TextMesh).text =PlayerPrefs.GetInt("Gold").ToString();
	}

	// Add an amount to the stored gold value 
	void IncreaseGoldValue(int val)
	{   
			PlayerPrefs.SetInt("Gold", PlayerPrefs.GetInt("Gold")+ val);
		GetGoldValues ();
	}

	// Decrease an amount to the stored gold value 
	bool DecreaseGoldValue(int val)
	{
			int GoldValue =  PlayerPrefs.GetInt ("Gold") - val;


		if (GoldValue < 0) {
						return false;
				}
		else {
			PlayerPrefs.SetInt ("Gold", GoldValue);
			GetGoldValues ();
			return true;
				}
	}

	// Animation of the logo 
	void AnimateLogo ()
	{   	
		Sequence	mySequence = new Sequence(new SequenceParms().Loops(-1));
		TweenParms parms;

		Color oldColor = _Logo.GetComponent<Renderer>().material.color;
			parms = new TweenParms().Prop("color", new Color(oldColor.r, oldColor.b, oldColor.g, 0.4f)).Ease(EaseType.EaseInQuart);

		parms = new TweenParms().Prop("localScale", new Vector3(1.1f,1.1f,-2)).Ease(EaseType.EaseOutElastic);
		mySequence.Append(HOTween.To(_Logo.transform, 6f, parms));


		parms = new TweenParms().Prop("localScale", new Vector3(0.9f,0.9f,-2)).Ease(EaseType.EaseOutElastic);
		mySequence.Append(HOTween.To(_Logo.transform, 5f, parms));

		mySequence.Play ();
	}

}