#include "SDL2/SDL.h"
#include <stdbool.h>
//Write a function that moves an image based on which arrow keys are pressed.
//something like
//functionize, everything
//void move_image(direction, image);




int main ( int argc, char *argv[] )
{
  /* initialize SDL */
  if (SDL_Init(SDL_INIT_EVERYTHING) != 0){
		printf("Unable to init SDL!: %s\n", SDL_GetError());
		return 1;
	}

	
	/* init surfaces */
	SDL_Window* screen; //No longer need to do this part I suppose
	SDL_Renderer* renderer;
	SDL_Surface* temp;
	SDL_Texture* top_image;

	const char background_imagefile[] = "sdl_logo.bmp";
	SDL_Surface* background_surface;
	SDL_Texture* background_texture;
	SDL_Rect top_image_dest = { 0 };
	/*Event handler */
	SDL_Event e;

	int screen_width = 1024, screen_height = 768;
	int top_image_width = 0, top_image_height = 0;
	int movement_speed = 1;


  /* create window of size 640x480 and set title bar*/ 
	screen = SDL_CreateWindow("SDL TEST", 
														SDL_WINDOWPOS_CENTERED,
														SDL_WINDOWPOS_CENTERED,
														screen_width, screen_height,
														0);

	if (screen == NULL){
		printf("Unable to set video mode: %s\n", SDL_GetError());
		return 1;
	}
	
	renderer = SDL_CreateRenderer(screen, -1, 0);

	if (renderer == NULL){
		printf("Unable to create renderer: %s\n", SDL_GetError());
	}

	atexit(SDL_Quit);

  /* load bitmap to surface */
  background_surface = SDL_LoadBMP(background_imagefile);

	if (background_surface == NULL){
		printf("Unable to find image!!: %s\n", SDL_GetError());
		return 1;
	}
	else{
  /* convert bitmap to texture */
		background_texture = SDL_CreateTextureFromSurface(renderer, background_surface);
		SDL_FreeSurface(background_surface); // No longer need the surface
		background_surface = NULL;
		if(background_texture == NULL) {
			printf("Failed to create texture from background surface: %s\n", SDL_GetError());
			return 1;
		}
	}

	/* load top_image image to practice blit on top of surface*/
	temp = SDL_LoadBMP("dinowheel.bmp");
	if (temp == NULL){
		printf("Unable to load top_image: %s/n", SDL_GetError());
		return 1;
	}
	else{
		top_image = SDL_CreateTextureFromSurface(renderer, temp);
		SDL_FreeSurface(temp);
		temp = NULL;

		if(top_image == NULL) {
			printf("Failed to create texture from top_image: %s\n", SDL_GetError());
			return 1;
		}

		/* Get height and width of top_image */
		SDL_QueryTexture(top_image, NULL, NULL, &top_image_width, &top_image_height);
		
		/* Prepare top_image for inital position */
		top_image_dest.x = (screen_width / 2) - (top_image_width / 2);
		top_image_dest.y = (screen_width / 2) - (top_image_height / 2);
		top_image_dest.w = top_image_width;
		top_image_dest.h = top_image_height;
	}

  int gameover = 0;

  /* message pump */
  while (!gameover)
  {
    /* look for an event */
//    if (SDL_PollEvent(&event)) {
      /* an event was found */
//      switch (event.type) {
        /* close button clicked */
//					case SDL_QUIT:
 //         gameover = 1;
//          break;

//          switch (event.key.keysym.sym) {
//            case SDLK_ESCAPE:
//            case SDLK_q:
//              gameover = 1;
//              break;
//						case SDLK_w:
//							printf("You just pressed 'w'\n");
//							break;
							
//						case SDLK_DOWN:
//							top_image_dest.y += movement_speed;
//							break; */
		/*Try handling the key_events differently */

		/*handle events on queue */
		while ( SDL_PollEvent( &e ) != 0)
		{
			if (e.type == SDL_QUIT)
			{
				gameover = 1;
			}

		}

		const Uint8* currentKeyStates = SDL_GetKeyboardState( NULL );
		if (currentKeyStates[ SDL_SCANCODE_ESCAPE ] || 
				currentKeyStates[ SDL_SCANCODE_Q ] )
		{
			gameover = 1;
		}

		if (currentKeyStates[ SDL_SCANCODE_LEFT ] )
		{
			top_image_dest.x -= movement_speed;
		}
		if (currentKeyStates[ SDL_SCANCODE_RIGHT ] )
		{
			top_image_dest.x += movement_speed;
		}
		if (currentKeyStates[ SDL_SCANCODE_UP ] )
		{
			top_image_dest.y -= movement_speed;
		}
		if (currentKeyStates[ SDL_SCANCODE_DOWN ] )
		{
			top_image_dest.y += movement_speed;
		}


  	/* render the background */
		SDL_RenderCopy(renderer, background_texture, NULL, NULL);

		/* Render entire top_image to center of screen */
		SDL_RenderCopy(renderer, top_image, NULL, &top_image_dest);

		/* Render here */
		SDL_RenderPresent(renderer);
	}

  /* cleanup SDL */
	if (renderer) SDL_DestroyRenderer(renderer);
	if (screen) SDL_DestroyWindow(screen);
	if (background_texture) SDL_DestroyTexture(background_texture);
	if (top_image) SDL_DestroyTexture(top_image);

  SDL_Quit();

  return 0;

}