/****************************************************************************
** ui.h extension file, included from the uic-generated form implementation.
**
** If you wish to add, delete or rename functions or slots use
** Qt Designer which will update this file, preserving your code. Create an
** init() function in place of a constructor, and a destroy() function in
** place of a destructor.
*****************************************************************************/

//Initialisation de la fenêtre de jeu
void frmJeu::init()
{
    Partie = CPartie();
    this->glJeuWidget1->setPartie(&Partie);
    glJeuWidget1->setFocus();
    txtCoup->setText(QString("Coup ") + QString::number(1));
    //On cache le bouton skip
    this->btnSkip->hide();
    btnReplay->hide();
}

/*------------------------------------------------------------------
  Fonction :	frmJeu::closeEvent
  
  Description :	Le event qui ferme la fenêtre
  
  Valeur retournée :	void : 
  
  Par : Martin Bisson, Anne-Marie Buki, Mylene Denis & Jean-Francois Pérusse
  MAJ: 
------------------------------------------------------------------*/
void frmJeu::closeEvent(QCloseEvent *)
{
    DernEtatJeu = Partie.getEtatJeu();
    if (DernEtatJeu == ETAT_CALCULS || DernEtatJeu == ETAT_REPLAY)
    {
	Partie.setEtatJeu(ETAT_INACTIF);
	glJeuWidget1->StopCalcTimer();
    }
    int Reponse = QMessageBox::question(this,"Fin de partie?","Tous les scores seront perdus!\n\nDésires-tu vraiment arrêter de jouer?","Oui, j'ai terminé de jouer","Non, je désire continuer à jouer");
    if (Reponse == 0)
    {
	accept();
    }
    if (Partie.getEtatJeu() == ETAT_INACTIF)
    {
	Partie.setEtatJeu(DernEtatJeu);
	glJeuWidget1->StartCalcTimer();
    }
}

/************************************************************************
  Cette fonction appelle la fonction ChargerParcours de la Partie
  
  Valeur de retour: booléenne
			     VRAI si le chargement réussi
		       FAUX sinon
  ***********************************************************************/
bool frmJeu::ChargerParcours(QString Parcours, int NbTerrains)
{
    return Partie.ChargerParcours(Parcours, NbTerrains);
}


void frmJeu::BallStoped()
{
    /*
    Si la balle est dans le trou
	|	Se mettre en mode INACTIF
	|   Garder le score du joueur
	|	Passer au joueur suivant
	|	Si pas de joueur suivant
	|	|	Afficher la carte de score
	|	|	Passer au terrain suivant
	|	|	Si pas de terrain suivant
	|	|	|	Retourner au menu
	|	|	|	Return
	|	|	->Sinon (Terrain suivant...)
	|	|	 |	Faire trier la liste des joueurs selon le dernier score
	|	|	 |	Mettre le joueur courant à 1
	|	|	 |	Demander un réaffichage du widget
	|	->Sinon (Joueur suivant...)
	|	 |	Rien...
	|	Se mettre en mode PLACEMENTBALLE
	|	Mettre le nombre de coup à 1
	|	Cacher le bouton "Skip"
	|	Demander un réaffichage du widget
	->Sinon (On joue d'autres coups)
	 |	Passer au coup suivant
	 |	Si le nombre de coups actuel est 7
	 |	|	Afficher le bouton "Skip"
	 |	Se mettre en mode FRAPPEBALLE
	*/
    btnReplay->show();
    txtMessage->show();
    if (Partie.getEtatJeu() != ETAT_REPLAY)
    {
	if (Partie.BallInHole())
	{
	    //Partie.PlayHoleSound();
	    Partie.setEtatJeu(ETAT_INACTIF);
	    Partie.AjoutPointage();
	    if(!Partie.JoueurSuivant())
	    {
		DebutTrou = true;
		frmScoreCard* ptrScore = new frmScoreCard(this,"Score Card");
		if (!Partie.TerrainSuivant())
		{
		    Partie.TrierTotal();
		    ptrScore->setup(&Partie);
		    ptrScore->exec();
		    accept();
		    return;
		} else {
		    Partie.Trier();
		    ptrScore->setup(&Partie);
		    ptrScore->exec();
		    Partie.setJoueurCourant(1);
		    glJeuWidget1->updateGL();
		}
		delete ptrScore;
	    } else {
		DebutTrou = false;
	    }
	    
	    //On affiche le nom du joueur courant
	    if (Partie.getJoueurs().size() != 1)
	    {
		//Si on a plus d'un joueur, afficher son nom
		glJeuWidget1->setMessage(QString(Partie.getJoueurs()[Partie.getJoueurCourant()-1].getNom()) + QString(", c'est a toi de jouer!"));
		glJeuWidget1->StartMessageTimer();
	    } else {
		Partie.setEtatJeu(ETAT_PLACEMENTBALLE);
	    }
	    
	    this->txtMessage->setText(
		    QString(Partie.getJoueurs()[Partie.getJoueurCourant()-1].getNom()) + QString(", c'est a toi de jouer!"));
	    Partie.getTerrain()->CentreBalleDepart();
	    
	    txtCoup->setText("");
	    Partie.setCoupCourant(1);
	    txtCoup->setText(QString("Coup ") + QString::number(1));
	    btnSkip->hide();
	    txtCoup->show();
	    glJeuWidget1->update();
	} else {
	    DebutTrou = false;
	    if (Partie.getCoupCourant() == 6)
	    {
		txtCoup->hide();
		btnSkip->show();
	    } else {
		txtCoup->show();
		Partie.CoupSuivant();
		txtCoup->setText(QString("Coup ") + QString::number(Partie.getCoupCourant()));
	    }
	    if (Partie.BallInWater())
	    {
		Partie.PlayWaterSound();
		Partie.getTerrain()->getBalle()->setPos(
			Partie.getTerrain()->getBalle()->getDernierePosition());
	    }
	    Partie.setEtatJeu(ETAT_FRAPPEBALLE);
	}
	btnReplay->show();
    } else {
	if (Partie.getCoupCourant() == 6)
	    btnSkip->show();
	else
	    txtCoup->show();
	if (Partie.BallInWater())
	{
	    Partie.PlayWaterSound();
	    Partie.getTerrain()->getBalle()->setPos(
		    Partie.getTerrain()->getBalle()->getDernierePosition());
	}
	if (Partie.BallInHole())
	{
	    //Partie.PlayHoleSound();
	    if (DebutTrou) Partie.TerrainSuivant();
	    if (DernEtatJeu == ETAT_PLACEMENTBALLE)
		Partie.getTerrain()->CentreBalleDepart();
	    else
		Partie.getTerrain()->getBalle()->setPos(PosTemp);
	}
	Partie.setEtatJeu(DernEtatJeu);
    }
}

/*------------------------------------------------------------------
  Fonction :	frmJeu::MouseClick
  
  Description :	Fonction qui gère le click de la souris
  
  Paramètres :
	  Qt::ButtonState button : État du bouton de la souris
	 bool mousedown : 
	 float x : Position en x de la souris
	 float y : Position en y de la souris
	 
  Valeur retournée :	void : 
  
  Par : 2004-3-16 Martin Bisson, Anne-Marie Buki, Mylene Denis & Jean-Francois Pérusse
  MAJ: 
------------------------------------------------------------------*/
void frmJeu::MouseClick( Qt::ButtonState button, bool mousedown, float x, float y)
{
    if (button == Qt::LeftButton && mousedown)
    {
	switch(Partie.getEtatJeu())
	{
		case ETAT_PLACEMENTBALLE:
		    if(Partie.PlacerBalleSurDepart(x,y))
		    {
			PosTemp = Partie.getTerrain()->getBalle()->getPos();
			glJeuWidget1->updateGL();
			Partie.setEtatJeu(ETAT_FRAPPEBALLE);
		    }
		    break;
		case ETAT_FRAPPEBALLE:
		    {
			//Si la souris est dans l'environnement proche de la balle
			if(Partie.ComparerPosition(DirTemp))
			{
			    btnReplay->hide();
			    txtMessage->hide();
			    btnSkip->hide();
			    txtCoup->hide();
			    Partie.getTerrain()->getBalle()->setDernierePosition(
				    Partie.getTerrain()->getBalle()->getPos());		
			    Partie.getTerrain()->getBalle()->setDirection(DirTemp);
			    Partie.getTerrain()->getBalle()->setDerniereDirection(DirTemp);
			    //Lorsque le click est fait, avancer la balle
			    Partie.setEtatJeu(ETAT_CALCULS);
			    this->glJeuWidget1->StartCalcTimer();
			}
		    }
		    break;
		case ETAT_CALCULS:
		    //rien
		    break;
		case  ETAT_INACTIF:
		    if (glJeuWidget1->getMessage() != "")
		    {
			glJeuWidget1->StopMessageTimer();
			glJeuWidget1->updateGL();
		    }
		    break;
		}
    }
}

/*------------------------------------------------------------------
  Fonction :	frmJeu::MouseMove
  
  Description :	Fonction qui gère le déplacement de la balle dans le Widget
  
  Paramètres :
	  Qt::ButtonState button : État du bouton de la souris
	 float x : Position en x de la souris
	 float y : Position en y de la souris
	 
  Valeur retournée :	void : 
  
  Par : 2004-3-16 Martin Bisson, Anne-Marie Buki, Mylene Denis & Jean-Francois Pérusse
  MAJ: 
------------------------------------------------------------------*/
void frmJeu::MouseMove( Qt::ButtonState button, float x, float y)
{
    Partie.setMousePosition(CVector3f(x,y,0));
    switch(Partie.getEtatJeu() )
    {
    case ETAT_PLACEMENTBALLE:
	if(Partie.PlacerBalleSurDepart(x,y))
	    glJeuWidget1->updateGL();
	break;
	
    case ETAT_FRAPPEBALLE:
	if(Partie.ComparerPosition(DirTemp))
	    glJeuWidget1->updateGL();
	break;
	
    case ETAT_CALCULS:
    case ETAT_INACTIF:
	//rien
	break;
    }
}

/*------------------------------------------------------------------
  Fonction :	frmJeu::MouseMove
  
  Description :	Fonction qui gere la roulette de la souris
  
    Paramètres :
	  int delta : Valeur du deplacement de la roulette (par defaut 120 ou -120)
	 
  Valeur retournée :	void : 
  
  Par : Martin Bisson, Anne-Marie Buki, Mylene Denis & Jean-Francois Pérusse
  MAJ: 
------------------------------------------------------------------*/
void frmJeu::MouseRoll(int delta)
{
    //Si roule par en avant
    if(delta > 0)
	glJeuWidget1->PanIn();
    //Si roule par en arriere
    else
	glJeuWidget1->PanOut();
    glJeuWidget1->updateGL();
}

/*------------------------------------------------------------------
  Fonction :	frmJeu::KeyPress
  
  Description :	Fonction qui gere les touches du clavier
  
    Paramètres :
	  int key : Touche appuyee
	  bool press : si la touche est appuyee ou relachee
	 
  Valeur retournée :	void : 
  
  Par : Martin Bisson, Anne-Marie Buki, Mylene Denis & Jean-Francois Pérusse
  MAJ: 
------------------------------------------------------------------*/
void frmJeu::KeyPress( int key, bool press )
{
    if(press)
    {
	switch(key)
	{
	case Qt::Key_Left:
	    glJeuWidget1->PanLeft();
	    break;
	case Qt::Key_Right:
	    glJeuWidget1->PanRight();
	    break;
	case Qt::Key_Up:
	    glJeuWidget1->PanUp();
	    break;	
	case Qt::Key_Down:
	    glJeuWidget1->PanDown();
	    break;
	case Qt::Key_I:
	    glJeuWidget1->PanIn();
	    break;
	case Qt::Key_O:
	    glJeuWidget1->PanOut();
	    break;
	case Qt::Key_A:
	    glJeuWidget1->StrafeLeft();
	    break;
	case Qt::Key_D:
	    glJeuWidget1->StrafeRight();
	    break;
	case Qt::Key_S:
	    glJeuWidget1->StrafeDown();
	    break;
	case Qt::Key_W:
	    glJeuWidget1->StrafeUp();
	    break;
	default:
	    break;
	}
	glJeuWidget1->updateGL();
    }
}

/*------------------------------------------------------------------
  Fonction :	frmJeu::SetJoueurs
  
  Description :	Form de QT pour afficher le joueur courant
  
  Paramètres :
	 std::vector< CJoueur > Joueurs : Liste de joueurs dans la partie actuelle
	 
  Valeur retournée :	void : 
  
  Par : 2004-3-16 Martin Bisson, Anne-Marie Buki, Mylene Denis & Jean-Francois Pérusse
  MAJ: 
------------------------------------------------------------------*/
void frmJeu::SetJoueurs( std::vector< CJoueur > Joueurs )
{
    Partie.SetJoueurs(Joueurs);
    //On affiche le nom du joueur courant
    this->txtMessage->setText(
	    QString(Partie.getJoueurs()[Partie.getJoueurCourant()-1].getNom()) + QString(", c'est a toi de jouer!"));
}

//Le joueur passe son tour (6 coups)
void frmJeu::btnSkipClick()
{
    Partie.getTerrain()->getBalle()->setPos(Partie.getTerrain()->getTrou()->getPos());
    BallStoped();
}

//Le joueur appuie sur "Arrêter de jouer"
void frmJeu::btnTermineClick()
{
    close();
}

//Le joueur appuie sur "Revoir le dernier coup"
void frmJeu::btnReplayClick()
{
    if (glJeuWidget1->getMessage() != "")
    {
	glJeuWidget1->StopMessageTimer();
	glJeuWidget1->updateGL();
    }
    if (DebutTrou) Partie.TerrainPrecedent();
    DernEtatJeu = Partie.getEtatJeu();
    btnReplay->hide();
    txtMessage->hide();
    btnSkip->hide();
    txtCoup->hide();
    Partie.getTerrain()->getBalle()->setPos(
	    Partie.getTerrain()->getBalle()->getDernierePosition());
    Partie.getTerrain()->getBalle()->setDirection(
	    Partie.getTerrain()->getBalle()->getDerniereDirection());
    //Lorsque le click est fait, avancer la balle
    Partie.setEtatJeu(ETAT_REPLAY);
    this->glJeuWidget1->StartCalcTimer();
}

void frmJeu::chkOiseaux( bool Valeur )
{
    Partie.setJoueOiseaux(Valeur);
}
