using GlitchyEngine.Math;

namespace GlitchyEngine.Renderer
{
	public class OrthographicCamera : OldCamera
	{
		protected float _bottom, _left, _right, _top;

		public float Bottom
		{
			get => _bottom;
			set
			{
				if(_bottom == value)
					return;

				_bottom = value;
				_projectionOutdated = true;
			}
		}
		
		public float Left
		{
			get => _left;
			set
			{
				if(_left == value)
					return;

				_left = value;
				_projectionOutdated = true;
			}
		}
		
		public float Right
		{
			get => _right;
			set
			{
				if(_right == value)
					return;

				_right = value;
				_projectionOutdated = true;
			}
		}
		
		public float Top
		{
			get => _top;
			set
			{
				if(_top == value)
					return;

				_top = value;
				_projectionOutdated = true;
			}
		}

		public float Width
		{
			get => _right - _left;
			set
			{
				Left = -value / 2.0f;
				Right = value / 2.0f;
			}
		}
		
		public float Height
		{
			get => _top - _bottom;
			set
			{
				Bottom = -value / 2.0f;
				Top = value / 2.0f;
			}
		}

		protected override void UpdateProjection()
		{
			Debug.Profiler.ProfileFunction!();

			_projection = Matrix.OrthographicProjectionOffCenter(_left, _right, _top, _bottom, _nearPlane, _farPlane);
		}

		protected override void UpdateTransform()
		{
			Debug.Profiler.ProfileFunction!();

			_transform = Matrix.Translation(_position) * Matrix.RotationZ(_rotation.Z) * Matrix.RotationY(_rotation.Y) * Matrix.RotationX(_rotation.X);
			_view = _transform.Invert();
		}
	}
}
