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

namespace AC.Downloads.ClickFX
{

	public class ClickFXSpawner : MonoBehaviour
	{

		#region Variables

		public Animator clickPrefab;
		[SerializeField] private string onHotspotTrigger = "Hotspot";
		[SerializeField] private string onNavMeshTrigger = "NavMesh";
		[SerializeField] private float lifeTime = 4f;

		#endregion


		#region UnityStandards

		private void OnEnable()
		{
			EventManager.OnHotspotInteract += OnHotspotInteract;
		}

		private void OnDisable()
		{
			EventManager.OnHotspotInteract -= OnHotspotInteract;
		}


		private void Update()
		{
			if (KickStarter.stateHandler.IsInGameplay() && !KickStarter.playerMenus.IsMouseOverMenu())
			{
				MouseState mouseState = KickStarter.playerInput.GetMouseState();
				if (mouseState == MouseState.SingleClick || mouseState == MouseState.DoubleClick)
				{
					Vector3 mouseScreenPosition = KickStarter.playerInput.GetMousePosition();
					mouseScreenPosition.z = PlayerZ - KickStarter.CameraMainTransform.position.z;
					Vector3 mouseWorldPosition = KickStarter.CameraMain.ScreenToWorldPoint(mouseScreenPosition);

					RaycastHit2D hit = Physics2D.Raycast(mouseWorldPosition, Vector2.zero);
					if (hit.collider)
					{
						if (hit.collider.gameObject.layer == LayerMask.NameToLayer(AC.KickStarter.settingsManager.navMeshLayer))
						{
							SpawnWithTrigger(mouseWorldPosition, onNavMeshTrigger);
							return;
						}
					}

					SpawnWithTrigger(mouseWorldPosition, string.Empty);
				}
			}
		}

		#endregion


		#region CustomEvents

		private void OnHotspotInteract(Hotspot hotspot, AC.Button button)
		{
			Vector3 mouseScreenPosition = KickStarter.playerInput.GetMousePosition();
			Vector3 mouseWorldPosition = Camera.main.ScreenToWorldPoint(mouseScreenPosition);
			mouseWorldPosition.z = PlayerZ;

			SpawnWithTrigger(mouseWorldPosition, onHotspotTrigger);
		}

		#endregion


		#region PrivateFunctions

		private void SpawnWithTrigger(Vector3 position, string triggerName)
		{
			GameObject spawnedClickOb = Instantiate(clickPrefab.gameObject, position, clickPrefab.transform.rotation);
			Destroy(spawnedClickOb, lifeTime);
			Animator _animator = spawnedClickOb.GetComponent<Animator>();

			if (!string.IsNullOrEmpty(triggerName))
			{
				_animator.SetTrigger(triggerName);
			}
		}

		#endregion


		#region GetSet

		private float PlayerZ => KickStarter.player ? KickStarter.player.Transform.position.z : 0f;

		#endregion

	}

}