﻿using UnityEngine;
using Opsive.UltimateCharacterController.Character.Abilities.AI;
using Opsive.UltimateCharacterController.Character.Abilities;
using AC;

public class AC_Motion : PathfindingMovement
{

	#region Variables

	private AC.Char acCharacter;

	#endregion


	#region PublicFunctions

	public override void Awake ()
	{
		acCharacter = m_GameObject.GetComponent <AC.Char> ();

		base.Awake ();
	}


	public override bool ShouldBlockAbilityStart (Ability startingAbility)
	{
		if (acCharacter.IsActivePlayer () &&
			KickStarter.stateHandler.IsInGameplay () &&
			!KickStarter.stateHandler.MovementIsOff &&
			KickStarter.settingsManager.movementMethod != MovementMethod.PointAndClick)
		{
			return false;
		}
		return true;
	}


	public override bool CanStopAbility (bool force)
	{
		if (!force)
		{
			if (acCharacter.IsActivePlayer () && KickStarter.settingsManager.movementMethod == MovementMethod.PointAndClick)
			{
				return false;
			}
		}
		return base.CanStopAbility (force);
	}


	public override bool SetDestination (Vector3 target)
	{
		return false;
	}


	public override Vector3 GetDestination ()
	{
		return acCharacter.GetTargetPosition (true);
	}


	public override void Teleport (Vector3 position)
	{
		acCharacter.Teleport (position, true);
	}

	#endregion


	#region PrivateFunctions

	private float GetTargetTurnAmount ()
	{
		var forwardA = m_Transform.rotation * Vector3.forward;
		var forwardB = acCharacter.GetTargetRotation () * Vector3.forward;

		var angleA = Mathf.Atan2(forwardA.x, forwardA.z) * Mathf.Rad2Deg;
		var angleB = Mathf.Atan2(forwardB.x, forwardB.z) * Mathf.Rad2Deg;
		return Mathf.DeltaAngle (angleA, angleB);
	}

	#endregion


	#region GetSet

	public override bool IsConcurrent
	{
		get
		{
			return false;
		}
	}


	public override bool HasArrived
	{
		get
		{
			return false;
		}
	}


	public override Vector2 InputVector
	{
		get
		{
			Vector3 direction = acCharacter.GetTargetPosition() - acCharacter.transform.position;
			Vector3 velocity = m_Transform.InverseTransformDirection(direction);

			if (velocity.sqrMagnitude > 1)
			{
				velocity.Normalize();
			}
			return new Vector2(velocity.x, velocity.z) * ((acCharacter.isRunning) ? 2f : 1f);
		}
	}


	public override Vector3 DeltaRotation
	{
		get
		{
			return Vector3.up * GetTargetTurnAmount();
		}
	}

	#endregion

}