﻿// (c) Copyright HutongGames, LLC 2010-2016. All rights reserved.

using UnityEngine;

namespace HutongGames.PlayMaker.Actions
{
	[ActionCategory(ActionCategory.Physics2D)]
	[Tooltip("Sets the various properties of a HingeJoint2d component")]
	public class SetHingeJoint2dProperties : FsmStateAction
	{
		
		[RequiredField]
		[Tooltip("The HingeJoint2d target")]
		[CheckForComponent(typeof(HingeJoint2D))]
		public FsmOwnerDefault gameObject;

		[ActionSection("Limits")]

		[Tooltip("Should limits be placed on the range of rotation?")]
		public FsmBool useLimits;

		[Tooltip("Lower angular limit of rotation.")]
		public FsmFloat min;

		[Tooltip("Upper angular limit of rotation")]
		public FsmFloat max;


		[ActionSection("Motor")]
		
		[Tooltip("Should a motor force be applied automatically to the Rigidbody2D?")]
		public FsmBool useMotor;
		
		[Tooltip("The desired speed for the Rigidbody2D to reach as it moves with the joint.")]
		public FsmFloat motorSpeed;
		
		[Tooltip("The maximum force that can be applied to the Rigidbody2D at the joint to attain the target speed.")]
		public FsmFloat maxMotorTorque;
		

		[Tooltip("Repeat every frame while the state is active.")]
		public bool everyFrame;
		
		HingeJoint2D _joint;
		JointMotor2D _motor;
		JointAngleLimits2D _limits;

		public override void Reset()
		{

			useLimits = new FsmBool() {UseVariable=true};			
			min = new FsmFloat() {UseVariable=true};
			max = new FsmFloat() {UseVariable=true};

			useMotor = new FsmBool() {UseVariable=true};			
			motorSpeed = new FsmFloat() {UseVariable=true};
			maxMotorTorque = new FsmFloat() {UseVariable=true};

			
			everyFrame = false;
			
		}
		
		public override void OnEnter()
		{
			var go = Fsm.GetOwnerDefaultTarget(gameObject);
			
			if (go != null)
			{
				_joint = go.GetComponent<HingeJoint2D>();
				
				if(_joint!=null)
				{
					_motor = _joint.motor;
					_limits = _joint.limits;
				}
			}
			
			SetProperties();
			
			if(!everyFrame)
			{
				Finish();
			}
		}
		
		public override void OnUpdate()
		{
			SetProperties();
		}
		
		void SetProperties()
		{
			if(_joint==null)
			{
				return;
			}

			if (!useMotor.IsNone)
			{
				_joint.useMotor = useMotor.Value;
			}
			
			if (!motorSpeed.IsNone)
			{
				_motor.motorSpeed = motorSpeed.Value;
				_joint.motor = _motor;
			}
			if (!maxMotorTorque.IsNone)
			{
				_motor.maxMotorTorque = maxMotorTorque.Value;
				_joint.motor = _motor;
			}

			if (!useLimits.IsNone)
			{
				_joint.useLimits = useLimits.Value;
			}
			
			if (!min.IsNone)
			{
				_limits.min = min.Value;
				_joint.limits = _limits;
			}
			if (!max.IsNone)
			{
				_limits.max = max.Value;
				_joint.limits = _limits;
			}

		}
		
	}
}