#include <allegro5/allegro.h>
#include <allegro5/allegro_image.h>
#include <allegro5/allegro_primitives.h>
#include <allegro5/allegro_font.h>
#include <allegro5/allegro_ttf.h>
#include "mappy_A5.h"
#include <iostream>
using namespace std;

const int WIDTH = 800;
const int HEIGHT = 600;

bool keys[] = {false, false, false, false};
enum KEYS{UP, DOWN, LEFT, RIGHT};

struct Player
{
	int x;
	int y;

	int bx;
	int by;
};

void InitPlayer(Player &player, int x, int y, int bx, int by);
void DrawPlayer(Player &player);
int main(void)
{
	//variables
	bool done = false;
	bool render = false;	

	int xOff = 0;
	int yOff = 0;

	int camerax;
	int cameray;

	Player player;

	InitPlayer(player, 300, 300, 16, 16);


	//allegro variable
	ALLEGRO_DISPLAY *display = NULL;
	ALLEGRO_EVENT_QUEUE *event_queue = NULL;
	ALLEGRO_TIMER *timer;
	
	//program init
	if(!al_init())										//initialize Allegro
		return -1;

	display = al_create_display(WIDTH, HEIGHT);			//create our display object

	if(!display)										//test display object
		return -1;

	//addon init
	al_install_keyboard();
	al_init_image_addon();
	al_init_font_addon();
	al_init_ttf_addon();
	al_init_primitives_addon();

	if(MapLoad("map2.FMP", 1))
		return -5;
	
	event_queue = al_create_event_queue();
	timer = al_create_timer(1.0 / 60);

	al_register_event_source(event_queue, al_get_timer_event_source(timer));
	al_register_event_source(event_queue, al_get_keyboard_event_source());

	al_start_timer(timer);
	while(!done)
	{
		ALLEGRO_EVENT ev;
		al_wait_for_event(event_queue, &ev);

		if(ev.type == ALLEGRO_EVENT_KEY_DOWN)
		{
			switch(ev.keyboard.keycode)
			{
			case ALLEGRO_KEY_ESCAPE:
				done = true;
				break;
			case ALLEGRO_KEY_LEFT:
				keys[LEFT] = true;
				break;
			case ALLEGRO_KEY_RIGHT:
				keys[RIGHT] = true;
				break;
			case ALLEGRO_KEY_UP:
				keys[UP] = true;
				break;
			case ALLEGRO_KEY_DOWN:
				keys[DOWN] = true;
				break;
			}
		}
		else if(ev.type == ALLEGRO_EVENT_KEY_UP)
		{
			switch(ev.keyboard.keycode)
			{
			case ALLEGRO_KEY_ESCAPE:
				done = true;
				break;
			case ALLEGRO_KEY_LEFT:
				keys[LEFT] = false;
				break;
			case ALLEGRO_KEY_RIGHT:
				keys[RIGHT] = false;
				break;
			case ALLEGRO_KEY_UP:
				keys[UP] = false;
				break;
			case ALLEGRO_KEY_DOWN:
				keys[DOWN] = false;
				break;
			}
		}
		else if(ev.type == ALLEGRO_EVENT_TIMER)
		{
			camerax = player.x - WIDTH/2;
			cameray = player.y - HEIGHT/2;

			player.x += keys[RIGHT] * 5;
			player.x -= keys[LEFT] * 5;

			if (camerax < 0) {camerax = 0;}
			if (camerax >= mapwidth*mapblockwidth - WIDTH) {camerax = mapwidth*mapblockwidth - WIDTH;}
			if (cameray < 0) {cameray = 0;}
			if (cameray >= mapheight*mapblockheight - HEIGHT) {cameray = mapheight*mapblockheight - HEIGHT;}

			render = true;
		}

		if(render && al_is_event_queue_empty(event_queue))
		{
			render = false;
			
			MapDrawBG(camerax,cameray, 0, 0, WIDTH, HEIGHT);
			DrawPlayer(player);

			al_flip_display();
			al_clear_to_color(al_map_rgb(0,0,0));
		}
	}

	MapFreeMem();
	al_destroy_event_queue(event_queue);
	al_destroy_display(display);						//destroy our display object

	return 0;
}

void InitPlayer(Player &player, int x, int y, int bx, int by)
{
	player.x = x;
	player.y = y;
	player.bx = bx;
	player.by = by;
}
void DrawPlayer(Player &player)
{
	al_draw_filled_rectangle(player.x - player.bx, player.y - player.by, player.x + player.bx, player.y + player.by,
		al_map_rgb(0,0,255));
}