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

using UnityEngine;

namespace HutongGames.PlayMaker.Actions
{
	[ActionCategory(ActionCategory.Device)]
	[Tooltip("Gets the rotation of the device around its z axis (into the screen). For example when you steer with the iPhone in a driving game.")]
	public class GetDeviceRoll : FsmStateAction
	{
		public enum BaseOrientation
		{
			Portrait,
			LandscapeLeft,
			LandscapeRight
		}
		
		[Tooltip("How the user is expected to hold the device (where angle will be zero).")]
		public BaseOrientation baseOrientation;
		[UIHint(UIHint.Variable)]
		public FsmFloat storeAngle;
		public FsmFloat limitAngle;
		public FsmFloat smoothing;
		public bool everyFrame;
		
		private float lastZAngle;
		
		public override void Reset()
		{
			baseOrientation = BaseOrientation.LandscapeLeft;
			storeAngle = null;
			limitAngle = new FsmFloat { UseVariable = true };
			smoothing = 5f;
			everyFrame = true;
		}
		
		public override void OnEnter()
		{
			DoGetDeviceRoll();
			
			if (!everyFrame)
				Finish();
		}
		

		public override void OnUpdate()
		{
			DoGetDeviceRoll();
		}
		
		void DoGetDeviceRoll()
		{
			float x = Input.acceleration.x;
			float y = Input.acceleration.y;
			float zAngle = 0;
			
			switch (baseOrientation) 
			{
			case BaseOrientation.Portrait:
				zAngle = -Mathf.Atan2(x, -y);
				break;
			case BaseOrientation.LandscapeLeft:
				zAngle = Mathf.Atan2(y, -x);
				break;
			case BaseOrientation.LandscapeRight:
				zAngle = -Mathf.Atan2(y, x);
				break;
			}
			
			if (!limitAngle.IsNone)
			{
				zAngle = Mathf.Clamp(Mathf.Rad2Deg * zAngle, -limitAngle.Value, limitAngle.Value);
			}
			
			if (smoothing.Value > 0)
			{
				zAngle = Mathf.LerpAngle(lastZAngle, zAngle, smoothing.Value * Time.deltaTime);
			}
			
			lastZAngle = zAngle;
			
			storeAngle.Value = zAngle;
		}
		
	}
}