using UnityEngine;
using RenownedGames.Apex;
using RenownedGames.AITree;

namespace AC.Downloads.AITree
{

	[NodeContent ("Move character", "Tasks/AC/Move character", IconPath = "Images/Icons/Node/MoveObjectIcon.png")]
	public class AC_MoveToPoint : TaskNode
	{

		[Title ("Node")]

		[SerializeField] private TransformKey character;
		[SerializeField] private TransformKey positionTransform;
		[SerializeField] private Vector3Key position;
		[SerializeField] private bool waitUntilFinish;

		private Char _character;
		private Transform targetTransform;
		private bool givenCommand;
		private float moveTime;


		protected override void OnEntry ()
        {
            base.OnEntry ();

			givenCommand = false;
			moveTime = 0f;

			if (character != null && character.TryCastValueTo<Transform> (out Transform transform))
			{
				_character = transform.GetComponent<Char> ();
				if (_character)
				{
					if (positionTransform != null && positionTransform.GetValue ())
					{
						targetTransform = positionTransform.GetValue ();
						_character.MoveToPoint (targetTransform.position);
						givenCommand = true;
					}

					if (position != null)
					{
						_character.MoveToPoint (position.GetValue ());
						givenCommand = true;
					}
				}
			}
		}


		protected override State OnUpdate ()
		{
			if (givenCommand)
			{
				if (waitUntilFinish && _character.IsMovingAlongPath ())
				{
					if (KickStarter.settingsManager && KickStarter.settingsManager.pathfindUpdateFrequency > 0f && targetTransform)
					{
						float repeatTime = moveTime + KickStarter.settingsManager.pathfindUpdateFrequency;
						if (Time.time > repeatTime)
						{
							MoveToTransform ();
						}
					}
					return State.Running;
				}
				return State.Success;
			}
			return State.Failure;
		}


		private void MoveToTransform ()
		{
			_character.MoveToPoint (targetTransform.position);
			moveTime = Time.time;
		}

	}

}
