﻿using System.Collections;
using System.Collections.Generic;
using TMPro;
using UnityEngine;

public class PopUpPrompt : MonoBehaviour {

	public int tootNum;
	public TutorialIsland island;
	MeshRenderer mRender;

	IEnumerator Appearing, Disappearing;
	float defaultAlpha, currentAlpha;

	public TextMeshProUGUI[] tmps = new TextMeshProUGUI[0];
	public UnityEngine.UI.Image[] images = new UnityEngine.UI.Image[0];

	void Awake () {
		island = FindObjectOfType<TutorialIsland> ();
		mRender = GetComponent<MeshRenderer>();

		if (mRender)
			defaultAlpha = mRender.material.color.a;
	}

	void OnTriggerEnter (Collider col) {
		if (col.tag == "Player") {
			island.ActivateText (tootNum);

			if (Appearing != null)
            {
				StopCoroutine(Appearing);
				Appearing = null;
			}

			Disappearing = Vanish();
			StartCoroutine(Disappearing);
		}
	}

	void OnTriggerExit (Collider col) {
		if (col.tag == "Player") {
			island.ActivateText (-1);

			if (Disappearing != null)
            {
				StopCoroutine(Disappearing);
				Disappearing = null;
            }

			Appearing = Materialize();
			StartCoroutine(Appearing);
		}
	}

	IEnumerator Materialize()
	{
		if (!mRender)
			yield break;

		while (mRender.material.color.a < defaultAlpha)
        {
			float newAlpha = mRender.material.color.a + Time.deltaTime;

			if (newAlpha > defaultAlpha)
				newAlpha = defaultAlpha;

			SetAlpha(mRender, newAlpha);

			foreach (TextMeshProUGUI tmp in tmps)
				SetAlpha(tmp, newAlpha / defaultAlpha);

			foreach (UnityEngine.UI.Image i in images)
				SetAlpha(i, newAlpha / defaultAlpha);

			yield return null;
        }
    }

	IEnumerator Vanish()
	{
		if (!mRender)
			yield break;

		while (mRender.material.color.a > 0)
		{
			float newAlpha = mRender.material.color.a - Time.deltaTime;

			if (newAlpha < 0)
				newAlpha = 0;

			SetAlpha(mRender, newAlpha);

			foreach (TextMeshProUGUI tmp in tmps)
				SetAlpha(tmp, newAlpha / defaultAlpha);

			foreach (UnityEngine.UI.Image i in images)
				SetAlpha(i, newAlpha / defaultAlpha);

			//transform.GetChild(0).GetComponent<TextMeshPro>().faceColor = new Color(1, 1, 1, newAlpha / defaultAlpha);
			//transform.GetChild(0).GetComponent<TextMeshPro>().outlineColor = new Color(0, 0, 0, newAlpha / defaultAlpha);

			yield return null;
		}

		Disappearing = null;
	}

	void SetAlpha(MeshRenderer renderer, float _newAlpha)
    {
		if (renderer)
			renderer.material.color = new Color(renderer.material.color.r, renderer.material.color.b, renderer.material.color.g, _newAlpha);
	}
	void SetAlpha(TextMeshProUGUI tmp, float _newAlpha)
    {
		if (tmp)
		{
			tmp.faceColor = new Color(tmp.faceColor.r, tmp.faceColor.b, tmp.faceColor.g, _newAlpha);
			tmp.outlineColor = new Color(tmp.outlineColor.r, tmp.outlineColor.b, tmp.outlineColor.g, _newAlpha);
		}
	}
	void SetAlpha(UnityEngine.UI.Image image, float _newAlpha)
    {
		if (image)
			image.color = new Color(image.color.r, image.color.b, image.color.g, _newAlpha);

	}
}
