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

namespace Nostalgia.Example
{
	[AddComponentMenu("Nostalgia/Example/Joystick")]
	public sealed class Joystick : MonoBehaviour, IPointerDownHandler, IPointerUpHandler, IEndDragHandler, IDragHandler
	{
		[SerializeField]
		private RectTransform _Stick;

		[SerializeField]
		private float _Deadzone = 0.001f;

		private RectTransform _RectTransform;
		private float _Radius;

		public float horizontal
		{
			get;
			private set;
		}

		public float vertical
		{
			get;
			private set;
		}

		void Awake()
		{
			_RectTransform = GetComponent<RectTransform>();
			Rect rect = _RectTransform.rect;
			_Radius = rect.width * 0.5f;
		}

		public void OnPointerDown(PointerEventData eventData)
		{
			OnDrag(eventData);
		}

		public void OnPointerUp(PointerEventData eventData)
		{
			OnEndDrag(eventData);
		}

		public void OnEndDrag(PointerEventData eventData)
		{
			SetPosition(Vector2.zero);
		}

		void SetPosition(Vector2 localPos)
		{
			_Stick.anchoredPosition = localPos;

			float h = localPos.x / _Radius;
			if (Mathf.Abs(h) < _Deadzone)
			{
				h = 0f;
			}
			horizontal = h;

			float v = localPos.y / _Radius;
			if (Mathf.Abs(v) < _Deadzone)
			{
				v = 0f;
			}
			vertical = v;
		}

		public void OnDrag(PointerEventData eventData)
		{
			Vector2 localPos;
			RectTransformUtility.ScreenPointToLocalPointInRectangle(_RectTransform, eventData.position, eventData.pressEventCamera, out localPos);
			
			localPos.x -= _Radius;
			localPos.y -= _Radius;
			localPos = localPos.normalized * Mathf.Clamp(localPos.magnitude, 0, _Radius);
			SetPosition(localPos);
		}
	}
}