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

public class UIPanel : MonoBehaviour
{
	public enum UIAnimType
	{
		Fade,
		ZoomIn,
		ZoomOut,
		SlideRight,
		SlideLeft,
		SlideUp,
		SlideDown
	}

	public bool showOnAwake = false;
	public string overrideNotifyName;
	public UIAnimType showAnimType = UIAnimType.Fade;
	public UIAnimType hideAnimType = UIAnimType.Fade;
	public AnimationCurve fadeCurve;
	public AnimationCurve showCurve;
	public AnimationCurve hideCurve;

	public float time = 0.5f;
	public float zoomAmount = 1.2f;
	public float slideAmount = 800f;

	private RectTransform rectTransform;
	private CanvasGroup canvasGroup;
	private Vector3 originalPos;

	void Awake ()
	{
		rectTransform = GetComponent<RectTransform>();
		canvasGroup = GetComponent<CanvasGroup>();
		if (canvasGroup == null)
			canvasGroup = gameObject.AddComponent<CanvasGroup>();

		if (overrideNotifyName == null || overrideNotifyName == "")
		{
			NotificationServer.register("show " + gameObject.name, showPanel);
			NotificationServer.register("hide " + gameObject.name, hidePanel);
		}
		else
		{
			NotificationServer.register("show " + overrideNotifyName, showPanel);
			NotificationServer.register("hide " + overrideNotifyName, hidePanel);
		}
	}

	void Start()
	{
		originalPos = rectTransform.anchoredPosition3D;

		if (showOnAwake)
			setShowState();
		else
			setHideState();
	}

	public void showPanel()
	{
		float startAlpha = 0f;
		float endAlpha = 1f;
		Vector3 startPos = originalPos;
		Vector3 endPos = originalPos;
		Vector3 startScale = Vector3.one;
		Vector3 endScale = Vector3.one;

		if (showAnimType == UIAnimType.ZoomIn)
			startScale /= zoomAmount;
		else if (showAnimType == UIAnimType.ZoomOut)
			startScale *= zoomAmount;
		else if (showAnimType == UIAnimType.SlideRight)
			startPos += Vector3.left * slideAmount;
		else if (showAnimType == UIAnimType.SlideLeft)
			startPos += Vector3.right * slideAmount;
		else if (showAnimType == UIAnimType.SlideUp)
			startPos += Vector3.down * slideAmount;
		else if (showAnimType == UIAnimType.SlideDown)
			startPos += Vector3.up * slideAmount;

		LeanTween.cancel(gameObject, true);
		canvasGroup.interactable = false;
		canvasGroup.blocksRaycasts = true;
		canvasGroup.alpha = startAlpha;
		rectTransform.anchoredPosition3D = startPos;
		transform.localScale = startScale;
		LeanTween.value(gameObject, 0f, 1f, time).setOnUpdate((float val)=>{
			canvasGroup.alpha = startAlpha + (endAlpha-startAlpha)*fadeCurve.Evaluate(val);
			rectTransform.anchoredPosition3D = startPos + (endPos-startPos)*showCurve.Evaluate(val);
			transform.localScale = startScale + (endScale-startScale)*showCurve.Evaluate(val);
		}).setOnComplete(setShowState);
	}

	public void hidePanel()
	{
		float startAlpha = 1f;
		float endAlpha = 0f;
		Vector3 startPos = originalPos;
		Vector3 endPos = originalPos;
		Vector3 startScale = Vector3.one;
		Vector3 endScale = Vector3.one;

		if (hideAnimType == UIAnimType.ZoomIn)
			endScale *= zoomAmount;
		else if (hideAnimType == UIAnimType.ZoomOut)
			endScale /= zoomAmount;
		else if (hideAnimType == UIAnimType.SlideRight)
			endPos += Vector3.right * slideAmount;
		else if (hideAnimType == UIAnimType.SlideLeft)
			endPos += Vector3.left * slideAmount;
		else if (hideAnimType == UIAnimType.SlideUp)
			endPos += Vector3.up * slideAmount;
		else if (hideAnimType == UIAnimType.SlideDown)
			endPos += Vector3.down * slideAmount;

		LeanTween.cancel(gameObject, true);
		canvasGroup.interactable = false;
		canvasGroup.blocksRaycasts = true;
		canvasGroup.alpha = startAlpha;
		rectTransform.anchoredPosition3D = startPos;
		transform.localScale = startScale;
		LeanTween.value(gameObject, 0f, 1f, time).setOnUpdate((float val)=>{
			canvasGroup.alpha = startAlpha + (endAlpha-startAlpha)*fadeCurve.Evaluate(val);
			rectTransform.anchoredPosition3D = startPos + (endPos-startPos)*hideCurve.Evaluate(val);
			transform.localScale = startScale + (endScale-startScale)*hideCurve.Evaluate(val);
		}).setOnComplete(setHideState);
	}

	public void setShowState()
	{
		canvasGroup.interactable = true;
		canvasGroup.blocksRaycasts = true;
		canvasGroup.alpha = 1f;
		rectTransform.anchoredPosition3D = originalPos;
		transform.localScale = Vector3.one;
	}

	public void setHideState()
	{
		canvasGroup.interactable = false;
		canvasGroup.blocksRaycasts = false;
		canvasGroup.alpha = 0f;
	}

	public void quitApplication()
	{
		Application.Quit();
	}

	public void startGame()
	{
		NotificationServer.notify("show GameUI");
	}
}
