#include <cmath>
#include <GL/glut.h>
#include <list>
#include <strstream>
#include <string>
#include <vector>

#include "globale.h"
#include "Temps.h"
#include "Attends.h"
#include "CVector3.h"
#include "CCamera.h"
#include "CCube.h"
#include "CBloc.h"
#include "CJeu.h"
#include "CWinStream.h"

int Termine = 0;




// Fonction qui affiche un message final avant de quitter

void MessageFin(int Sortie)
{
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

	glViewport(0,0, SCREEN_WIDTH, SCREEN_HEIGHT);

	unsigned char Message[] = "Merci pour votre partie de Tetris 3D";

	wout.Begin();
		wout.SetCouleur(1,1,1,1);
		wout.SetPos(CENTRE_X - (wout.Length(Message) >> 1), CENTRE_Y);
		wout << Message;
	wout.End();

	glutSwapBuffers();

	Attends(TEMPSFIN);

	exit(Sortie);
}




// Fonction du clavier pendant la pause

void keyboardPause(unsigned char key, int x, int y)
{
	if (key == 27)
		MessageFin(0);
	else
		Termine = 2;
}




// Fonction qui gère l'affichage durant la pause
// Termine = 0 : la première fois que la fonction est appelée
// Termine = 1 : On ne fait rien, l'affichage est déjà fait
// Termine = 2 : La fonction de clavier a fait que Termine = 2, donc que la pause est finie

void Pause(void)
{
	static long Temps0;

	if (Termine == 0)
	{
		Temps0 = GetTemps();

		gCamera.DisplayFunc = NoDisplay;

		glutIdleFunc(Pause);
		glutDisplayFunc(Pause);
		glutKeyboardFunc(keyboardPause);
		glutMouseFunc(0);
		glutMotionFunc(0);
		glutPassiveMotionFunc(0);

		glViewport(0,0, SCREEN_WIDTH, SCREEN_HEIGHT);

		unsigned char Message0[] = "Pause";
		unsigned char Message1[] = "Appuyez sur une touche pour revenir au jeu";
		unsigned char Message2[] = "Appuyez sur ESCAPE pour quitter le jeu";

		wout.Begin();

			glColor4f(0, 0, 0, ASSOMBPAUSE);
			glBegin(GL_QUADS);
				glVertex2i(0, 0);
				glVertex2i(0, SCREEN_HEIGHT);
				glVertex2i(SCREEN_WIDTH, SCREEN_HEIGHT);
				glVertex2i(SCREEN_WIDTH, 0);
			glEnd();
			
			wout.SetCouleur(1,1,1,1);
			
			wout.SetPos(CENTRE_X - (wout.Length(Message0) >> 1), 3 * (CENTRE_Y >> 1));
			wout << Message0;
			wout.flush();

			wout.SetPos(CENTRE_X - (wout.Length(Message1) >> 1), CENTRE_Y);
			wout << Message1;
			wout.flush();

			wout.SetPos(CENTRE_X - (wout.Length(Message2) >> 1), CENTRE_Y - 20);
			wout << Message2;

		wout.End();

		glutSwapBuffers();

		Termine = 1;
	}
	else if (Termine == 2)
	{
		Termine = 0;
		glViewport(0,0, SCREEN_WIDTH - LARGEURTEXTE, SCREEN_HEIGHT);
		gJeu.Bloc.Temps0 += GetTemps() - Temps0;
		gJeu.BlocPreview.Temps0Preview += GetTemps() - Temps0;
		
		if (gJeu.Bloc.EstMouvement)
			gJeu.Bloc.Temps0Mouv += GetTemps() - Temps0;
		if (gJeu.Bloc.EstEnBas)
			gJeu.Bloc.Temps0Arret += GetTemps() - Temps0;

		gJeu.SetGameFunc();
	}
}