using System;

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

namespace TestyMono
{

	class Cursor {

		static int CURSOR_SIZE = 8;

		Vector2 position;
		static Texture2D texture;
		Rectangle dimensions;

		public Cursor() {
			position = new Vector2(0, 0);
			dimensions = new Rectangle(0, 0, CURSOR_SIZE, CURSOR_SIZE);
		}

		public static void LoadContent(GraphicsDeviceManager graphics) {
			texture = new Texture2D(graphics.GraphicsDevice, 1, 1);
			texture.SetData(new[] { Color.White });
		}

		public void Update(GameTime gameTime) {
			var mousePos = Mouse.GetState().Position;
			position.X = (float)mousePos.X;
			position.Y = (float)mousePos.Y;
			dimensions.X = (int)position.X;
			dimensions.Y = (int)position.Y;
		}

		public void Draw(GameTime gameTime, SpriteBatch batch) {
			batch.Draw(texture, dimensions, Color.Gold);
		}

	}

	class Player {

		const int MOVEMENT_SPEED = 128; // pixels per second i guess?

		Vector2 position;
		Vector2 direction;
		Rectangle dimensions;
		static Texture2D texture;

		public Player() {
			position = new Vector2(0, 0);
			direction = new Vector2(0, 0);
			dimensions = new Rectangle(0, 0, 32, 32);
		}

		public static void LoadContent(GraphicsDeviceManager graphics) {
			texture = new Texture2D(graphics.GraphicsDevice, 1, 1);
			texture.SetData(new[] { Color.White });
		}

		public void Update(GameTime gameTime) {
			var delta = new Vector2(0, 0);
			var state = Keyboard.GetState();
			var deltaSeconds = (float)gameTime.ElapsedGameTime.TotalSeconds;
			if (state.IsKeyDown(Keys.W)) {
				position.Y -= 1 * deltaSeconds * MOVEMENT_SPEED;
			} else if (state.IsKeyDown(Keys.S)) {
				position.Y += 1 * deltaSeconds * MOVEMENT_SPEED;
			}
			if (state.IsKeyDown(Keys.A)) {
				position.X -= 1 * deltaSeconds * MOVEMENT_SPEED;
			} else if (state.IsKeyDown(Keys.D)) {
				position.X += 1 * deltaSeconds * MOVEMENT_SPEED;
			}
			dimensions.X = (int)position.X;
			dimensions.Y = (int)position.Y;
		}

		public void Draw(GameTime gameTime, SpriteBatch batch) {
			batch.Draw(texture, dimensions, Color.Orange);
		}

	}
	// Player
	
	/// <summary>
	/// This is the main type for your game.
	/// </summary>
	public class Game1 : Game {
		GraphicsDeviceManager graphics;
		SpriteBatch spriteBatch;

		// temp
		Cursor cursor;
		Player player;

		public Game1() {
			graphics = new GraphicsDeviceManager(this);
			Content.RootDirectory = "Content";
			player = new Player();
			cursor = new Cursor();
		}

		/// <summary>
		/// Allows the game to perform any initialization it needs to before starting to run.
		/// This is where it can query for any required services and load any non-graphic
		/// related content.  Calling base.Initialize will enumerate through any components
		/// and initialize them as well.
		/// </summary>
		protected override void Initialize() {
			// TODO: Add your initialization logic here
			base.Initialize();
		}

		/// <summary>
		/// LoadContent will be called once per game and is the place to load
		/// all of your content.
		/// </summary>
		protected override void LoadContent() {
			// Create a new SpriteBatch, which can be used to draw textures.
			spriteBatch = new SpriteBatch(GraphicsDevice);
			Player.LoadContent(graphics);
			Cursor.LoadContent(graphics);
			//TODO: use this.Content to load your game content here 
		}

		/// <summary>
		/// Allows the game to run logic such as updating the world,
		/// checking for collisions, gathering input, and playing audio.
		/// </summary>
		/// <param name="gameTime">Provides a snapshot of timing values.</param>
		protected override void Update(GameTime gameTime) {
			// For Mobile devices, this logic will close the Game when the Back button is pressed
			// Exit() is obsolete on iOS
#if !__IOS__ && !__TVOS__
			if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed || Keyboard.GetState().IsKeyDown(Keys.Escape))
				Exit();
#endif

			// TODO: Add your update logic here
			player.Update(gameTime);
			cursor.Update(gameTime);
			base.Update(gameTime);
		}

		/// <summary>
		/// This is called when the game should draw itself.
		/// </summary>
		/// <param name="gameTime">Provides a snapshot of timing values.</param>
		protected override void Draw(GameTime gameTime) {
			graphics.GraphicsDevice.Clear(Color.CornflowerBlue);

			//TODO: Add your drawing code here

			spriteBatch.Begin();
			player.Draw(gameTime, spriteBatch);
			cursor.Draw(gameTime, spriteBatch);
			spriteBatch.End();

			base.Draw(gameTime);
		}
	}
}
