#include "main.h"

namespace scrnfunk
{
	// Optimize image on load to reduce processing.
	SDL_Surface *load_image(const char *file)
	{
		SDL_Surface *image_format;
		SDL_Surface *screen_format;

		// Load image
		image_format = IMG_Load(file);

		/*
		    DOES THE FILE EVEN EXIST?
		*/

		if(image_format != 0)
		{
		    // Optimize
		    screen_format = SDL_DisplayFormat(image_format);
		
		    // Release old image
		    SDL_FreeSurface(image_format);
		}

		return screen_format;
	}
	
	void apply_image(int x, int y, SDL_Surface* source, SDL_Surface* destination, SDL_Rect* clip)
	{
		SDL_Rect pos;

		pos.x = x;
		pos.y = y;

		SDL_BlitSurface(source, clip, destination, &pos);
	}

	// Removes color from an image.
	bool RemoveColor(SDL_Surface* image, Uint8 R, Uint8 G, Uint8 B)
	{
		int result;

		// Map color on the image
		Uint32 color = SDL_MapRGB(image->format, R, G, B);

		// Remove color from the image.
		result = SDL_SetColorKey(image, SDL_SRCCOLORKEY, color);

		if(!result)
		    return true;
		else 
		    return false;
	}
}




namespace scrns
{
	// Returns 1 (true) on success, 0 (false) on error.
	SDL_Surface * initiateSDL(SDL_Surface *screen, int x, int y)
	{
		SDL_Surface *vid_init;
		int init, ttf_ret;
	
		// Initiate SDL and check
		init = SDL_Init(SDL_INIT_VIDEO);
		if(init < 0)
		{
			fprintf(stderr, "Unable to initiate SDL: %s\n", SDL_GetError());
			return NULL;
		}

		
		// Set video and check
		vid_init = SDL_SetVideoMode(x, y, 32, SDL_SWSURFACE);
		if(vid_init == 0)
		{
		    fprintf(stderr, "Video initialization failed: %s", SDL_GetError());
		    return NULL;
		}


		// Get video surface and check
		screen = SDL_GetVideoSurface();
		if(screen == NULL)
		{
		    fprintf(stderr, "Failed to get video surface: %s", SDL_GetError());
		    return NULL;
		}

		// Set window title
		SDL_WM_SetCaption(WINDOW_TITLE " " VERSION, 0);


		// Initialize SDL_ttf and check
		ttf_ret = TTF_Init();
		if(ttf_ret == -1)
		{
		    fprintf(stderr, "True Type Font initialization failed: %s", SDL_GetError());
		    return NULL;
		}

		// Success
		return screen;
	}

	SDL_Surface * MainMenu()
	{
		// Screen
		SDL_Surface *screen = 0;

		SDL_Surface *background = 0;
		SDL_Surface *characters = 0;
		SDL_Surface *message = 0;


		// Image filenames
		const char *background_image = "bin/stage1.bmp";
		const char *characters_image = "bin/characters.bmp";

		// Char
		SDL_Rect clip[2];
		
		screen = initiateSDL(screen, 900, 675);

		if(screen == NULL)
		{
			fprintf(stderr, "Start up failure.\n");
			return NULL;
		}
		else
		{
			// Load images
			background = scrnfunk::load_image(background_image);
			characters = scrnfunk::load_image(characters_image);
		
			// The troll's coordinates 
			clip[0].x = 0;
			clip[0].y = 0;
			clip[0].w = 200;
			clip[0].h = 160;
		
			// The codfish's coordinates
			clip[1].x = 0;
			clip[1].y = 160;
			clip[1].w = 200;
			clip[1].h = 100;
		
			// Remove the background from the characters
			scrnfunk::RemoveColor(characters, 0x00, 0xFF, 0x00); // Green
		
			// Blit background image
			scrnfunk::apply_image(0, 0, background, screen);
		
			// Blit troll image
			scrnfunk::apply_image(700, 40, characters, screen, &clip[0]);
		
			// Blit codfish image
			scrnfunk::apply_image(150, 300, characters, screen, &clip[1]);

			// Setup welcome text
			SDL_Color whitecolor = { 255, 255, 255 };
			TTF_Font *font = TTF_OpenFont("bin/CaviarDreams.ttf", 80);
			const char* text = "Welcome to Trololo";
		
		
			if(!font)
			{
				fprintf(stderr, "TTF_OpenFont: %s\n", TTF_GetError());
			}
		
			/*
					Checks if font or text is 0 due to the documentation:
					0 font into this function will cause a segfault.
					0 text into this function will result in undefined behavior.
			*/
			if(font != 0 && text != 0)
				message = TTF_RenderText_Solid(font, text, whitecolor);
			else
				fprintf(stderr, "TFF Render Text Solid Error: init error\n");
		
			// Apply message
			if(message != 0)
				scrnfunk::apply_image(100, 200, message, screen);
			else
				fprintf(stderr, "TFF Render Text Solid Error: apply error\n");
		
			if(screen != 0)
				SDL_Flip(screen);
			else
				fprintf(stderr, "Couldn't update screen.\n");
		}
	
		return screen;
	}
}
