﻿using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;
using System.Collections;

namespace Nostalgia.Example
{
	[AddComponentMenu("Nostalgia/Example/InfoBoard")]
	public sealed class InfoBoard : MonoBehaviour
	{
		static InfoBoard _Instance;

		public GameObject window;
		public Image icon;
		public Text text;

		private RectTransform _RectTransform;
		private Canvas _Canvas;
		private Vector3 _WorldPosition;
		private Coroutine _UpdatePosition;

		private bool _IsOpen = false;

		void Awake()
		{
			_Instance = this;
			_RectTransform = GetComponent<RectTransform>();
			_Canvas = GetComponentInParent<Canvas>();
		}

		public static void Open(string message, Sprite sprite, Vector3 worldPosition)
		{
			_Instance.OpenInternal(message, sprite, worldPosition);
		}

		void OpenInternal(string message, Sprite sprite, Vector3 worldPosition)
		{
			if (!_IsOpen || text.text != message || icon.sprite != sprite)
			{
				if (sprite != null)
				{
					icon.gameObject.SetActive(true);
					icon.sprite = sprite;
				}
				else
				{
					icon.gameObject.SetActive(false);
				}
				text.text = message;

				window.SetActive(true);

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

				_IsOpen = true;

				_UpdatePosition = StartCoroutine(UpdatePosition(worldPosition));
			}
		}

		IEnumerator UpdatePosition(Vector3 worldPosition)
		{
			while (_IsOpen)
			{
				Vector2 screenPos = RectTransformUtility.WorldToScreenPoint(Camera.main, worldPosition);
				if (_Canvas.renderMode != RenderMode.ScreenSpaceOverlay)
				{
					Vector2 pos = Vector2.zero;
					RectTransform canvasRectTransform = _Canvas.GetComponent<RectTransform>();
					RectTransformUtility.ScreenPointToLocalPointInRectangle(canvasRectTransform, screenPos, _Canvas.worldCamera, out pos);

					_RectTransform.localPosition = pos;
				}
				else
				{
					_RectTransform.position = screenPos;
				}

				yield return null;
			}
		}

		public static void Close()
		{
			_Instance.CloseInternal();
		}

		void CloseInternal()
		{
			if (_UpdatePosition != null)
			{
				StopCoroutine(_UpdatePosition);
				_UpdatePosition = null;
			}

			window.SetActive(false);
			_IsOpen = false;
		}
	}
}
