using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;

namespace SpacePew.Camera
{
	public interface ICamera2D
	{
		/// <summary>
		/// Gets or sets the position of the camera
		/// </summary>
		/// <value>The position.</value>
		Vector2 Position { get; set; }

		/// <summary>
		/// Gets or sets the move speed of the camera.
		/// The camera will tween to its destination.
		/// </summary>
		/// <value>The move speed.</value>
		float MoveSpeed { get; set; }

		/// <summary>
		/// Gets or sets the rotation of the camera.
		/// </summary>
		/// <value>The rotation.</value>
		float Rotation { get; set; }

		/// <summary>
		/// Gets the origin of the viewport (accounts for Scale)
		/// </summary>        
		/// <value>The origin.</value>
		Vector2 Origin { get; }

		/// <summary>
		/// Gets or sets the scale of the Camera
		/// </summary>
		/// <value>The scale.</value>
		float Scale { get; set; }

		/// <summary>
		/// Gets the screen center (does not account for Scale)
		/// </summary>
		/// <value>The screen center.</value>
		Vector2 ScreenCenter { get; }

		/// <summary>
		/// Gets the transform that can be applied to 
		/// the SpriteBatch Class.
		/// </summary>
		/// <see cref="SpriteBatch"/>
		/// <value>The transform.</value>
		Matrix Transform { get; }

		/// <summary>
		/// Gets or sets the focus of the Camera.
		/// </summary>
		/// <seealso cref="IFocusable"/>
		/// <value>The focus.</value>
		IFocusable Focus { get; set; }

		/// <summary>
		/// Determines whether the target is in view given the specified position.
		/// This can be used to increase performance by not drawing objects
		/// directly in the viewport
		/// </summary>
		/// <param name="position">The position.</param>
		/// <param name="texture">The texture.</param>
		/// <returns>
		///     <c>true</c> if the target is in view at the specified position; otherwise, <c>false</c>.
		/// </returns>
		bool IsInView(Vector2 position, Texture2D texture);
	}
}