/*=============================================================================
	  ___________
	 /           \		Par Martin Robinson
	|   @#!$*%    |		logiciel libre GPL
	 \_______   _/
	 		 \ |  ___________
	    	  \| |   O   O   |
				 |  _______  |
				 | | | | | | |
===============================================================================
Preprocesseur
=============================================================================*/

#include "SDL/SDL.h"
#include "SDL/SDL_mixer.h"
#include "main.hpp"
#include "../lib/sdlMR.hpp"
#include "../lib/sdlMixerMR.hpp"
#include "spiele.hpp"
#include "spieleSDL.hpp"

/*=============================================================================
prototype de fonction
=============================================================================*/

template <int _W,int _H>
bool updateGame(SDL_Surface*, spieleUI<_W,_H> &, int , int , int );

/*=============================================================================
programme principal
=============================================================================*/
int main(int argc, char* argv[])
{
    //===========================================================Initialisation SDL
	int gameState = 1,								//dans quel level nous nous trouvons, 1 = screen titre
		controlState = -1,                            //pour envoyer au jeux
		nextGameState = 0,                       //etape transitoir pour animation rideau
		curtainPos = 0;                             //position du rideau
	SDL_Event event;									//événement capté par SDL_PollEvent
	SDL_Surface *screen = commencer<40*SIZE,25*SIZE>("!#@*"),                //screen principale
				*titleBg = ouvrireImage<255,128,255>("./img/title.bmp"),      //arriere plan titre
				*tooth = ouvrireImage<255,128,255>("./img/tooth.bmp"),      //rideau
                *spriteSheet = ouvrireImage<255,128,255>("./img/bot.bmp"),  //feuille de sprite
				*ragequitBg = ouvrireImage<255,128,255>("./img/loose.bmp");	//quand l'utilisateur quit
	commencerMixer();
	Mix_Music * titreMus = ouvrireMusique("./snd/goof.ogg"),                //charger la musique
	          * level1Mus = ouvrireMusique("./snd/robot_wars.ogg"),
			  * level2Mus = ouvrireMusique("./snd/axxo.ogg"),
			  * ragequitMus = ouvrireMusique("./snd/down.ogg");
	play(titreMus);
	//===========================================================Initialisation Jeux
	spieleUI<titleW,titleH> title(titleLVL,thoseShape0,spriteSheet,titleW,titleH);
	spieleUI<level1W,level1H> level1(level1T,thoseShape1,spriteSheet,40,20);
	spieleUI<level2W,level2H> level2(level2T,thoseShape1,spriteSheet,40,25);
	spieleUI<ragequitW,ragequitH> ragequit(ragequitT,thoseShape1,spriteSheet,40,25);
	//============================================================boucle principale
	while(gameState!=-1)
	{
		//saisie de donnée timer et controle utilisateur
		synchronizeMoi<60>();		//60 images par seconde
		if (SDL_PollEvent(&event))	//pile devenement
			switch(event.type)		//selon le type d’événement
			{
				case SDL_QUIT:
					gameState=-1;
					break;
				case SDL_KEYDOWN:
					switch (event.key.keysym.sym)
					{
						case SDLK_ESCAPE:
						    //pour lecran titre, se veut dire quitter le jeux
						    //pour les autres écrans, ça veut dire quitter vers l'ecran titre
						    if (gameState==8)
							    gameState=-1;
							else
							    nextGameState=8;
							break;
						case SDLK_RETURN:
							if (gameState==1)
								nextGameState=2;
							break;
						case SDLK_SPACE:
							controlState = -1;
							break;
						case SDLK_q:
							controlState = 0;
							break;
						case SDLK_w:
							controlState = 1;
							break;
						case SDLK_e:
							controlState = 2;
							break;
						case SDLK_a:
							controlState = 3;
							break;
						case SDLK_s:
							controlState = 4;
							break;
						case SDLK_d:
							controlState = 5;
							break;
						case SDLK_z:
							controlState = 6;
							break;
						case SDLK_x:
							controlState = 7;
							break;
						case SDLK_c:
							controlState = 8;
							break;
					}
					break;
			}

		//mettre à jour le jeu
		switch (gameState)
		{
		case 1:
			//screen titre
			updateGame<titleW,titleH>(screen, title,controlState,0,260);
			break;
		case 2:
			//premier niveau
			if (updateGame<level1W,level1H>(screen, level1,controlState,0,0))
			    nextGameState=3;    //il retourne vrai si la partie est gagné. changement de level
			break;
		case 3:
			//deuxieme niveau
			if (updateGame<level2W,level2H>(screen, level2,controlState,0,0))
			    nextGameState=8;    //il retourne vrai si la partie est gagné. changement de level
			break;
		case 8:
			//deuxieme niveau
			updateGame<ragequitW,ragequitH>(screen, ragequit,controlState,0,0);
			break;
		}
        controlState = 1000;

		//transition entre les partie
		if (nextGameState)
		{
		    //lever et descente de la position du rideau
			if (nextGameState != gameState)
				if (curtainPos<250)
					curtainPos+=4;
				else
					gameState=nextGameState;
			else
				if (curtainPos>0)
					curtainPos-=6;
				else
					nextGameState = 0;
            //afficher le rideau
			for (int i=0;i<8;i++)
			{
				SDL_Rect tmp = {100*i,curtainPos-250,0,0};
				SDL_BlitSurface(tooth,NULL,screen,&tmp);
				tmp.y = 500-curtainPos;
				SDL_BlitSurface(tooth,NULL,screen,&tmp);
			}
			//changer la musique
            if (!nextGameState)
            {
                stop();
                switch (gameState)
                {
                case 1:
                    play(titreMus);
                    break;
                case 2:
                    play(level1Mus);
                    break;
				case 3:
					play(level2Mus);
					break;
				case 8:
					play(ragequitMus);
					break;
                }
	        }
	    }

		//mise a jour de l'screen
		SDL_Flip(screen);
		if (gameState==1)
			SDL_BlitSurface(titleBg,NULL,screen,NULL);
		else if(gameState==8)
			SDL_BlitSurface(ragequitBg,NULL,screen,NULL);
		else
			SDL_FillRect(screen, NULL, SDL_MapRGB(screen->format, 0, 0, 0));
	}
    stop();
    Mix_CloseAudio();
    SDL_Quit(); // Arrêt de la SDL (libération de la mémoire).
    return 0;
}

/*=============================================================================
fonction
=============================================================================*/

template <int _W,int _H>
bool updateGame(SDL_Surface * screen, spieleUI<_W,_H> & jeux, int controlState, int x, int y)
{
		jeux.control(controlState);
		if (!jeux.updated())
			jeux.update();
		else
			jeux.process();
        jeux.draw(screen,x,y);
        return jeux.end();
}
