using QSB.Utility;
using UnityEngine;

namespace QSB.Player
{
	public class PlayerHUDMarker : HUDDistanceMarker
	{
		private PlayerInfo _player;
		private bool _needsInitializing;
		private bool _isReady;

		public override void InitCanvasMarker()
		{
			_markerRadius = 2f;

			_markerTarget = new GameObject().transform;
			_markerTarget.parent = transform;

			_markerTarget.localPosition = Vector3.up * 0.25f;
		}

		public void Init(PlayerInfo player)
		{
			_player = player;
			_player.HudMarker = this;
			_needsInitializing = true;
		}

		private void Update()
		{
			if (_needsInitializing)
			{
				Initialize();
			}

			if (!_isReady || !_player.IsReady)
			{
				return;
			}

			if (_canvasMarker != null)
			{
				var isVisible = _canvasMarker.IsVisible();

				if (_player.Visible != isVisible)
				{
					_canvasMarker.SetVisibility(_player.Visible);
				}
			}
			else
			{
				DebugLog.ToConsole($"Warning - _canvasMarker for {_player.PlayerId} is null!", OWML.Common.MessageType.Warning);
			}
		}

		private void Initialize()
		{
			if (_player.Name == null)
			{
				DebugLog.ToConsole($"Error - {_player.PlayerId} has a null name!", OWML.Common.MessageType.Error);
				_player.Name = "NULL";
			}

			_markerLabel = _player.Name.ToUpper();
			_needsInitializing = false;
			_isReady = true;

			base.InitCanvasMarker();
		}

		public void Remove()
		{
			_isReady = false;
			// do N O T destroy the parent - it completely breaks the ENTIRE GAME
			if (_canvasMarker != null)
			{
				_canvasMarker.DestroyMarker();
			}

			if (_markerTarget != null)
			{
				Destroy(_markerTarget.gameObject);
			}

			Destroy(this);
		}
	}
}