/*====================ÉCOLE POLYTECHNIQUE DE MONTRÉAL============================

	NOM DU FICHIER :ChoixTerrain.ui.h

	DESCRIPTION :	Fichier contenant l'implémentation de la class 
					ChoixTerrainForm, un form qui permet de choisir le terrain 
					à éditer

	AUTEUR : Martin Bisson, Anne-Marie Buki, Mylène Denis & Jean-François Pérusse

	DATE DE CRÉATION : 2004-3-17

	MISES À JOUR :

===============================================================================*/


/*------------------------------------------------------------------
  Fonction :	ChoixTerrainForm::init

  Description :	Fonction qui remplace le constructeur

  Paramètres :

  Valeur retournée :	void : 

  Par : 2004-3-17 Martin Bisson, Anne-Marie Buki, Mylène Denis & Jean-François Pérusse
  MAJ: 
------------------------------------------------------------------*/
void ChoixTerrainForm::init()
{
    view1a9 = true;
    
    adjustSize();
}




/*------------------------------------------------------------------
  Fonction :	CopieFichier

  Description :	Fonction qui copie un fichier

  Paramètres :
	 const QString& from : Nom du fichier à copier
	 const QString& to : Nom de la copie

  Valeur retournée :	void : 

  Par : 2004-3-17 Martin Bisson, Anne-Marie Buki, Mylène Denis & Jean-François Pérusse
  MAJ: 
------------------------------------------------------------------*/
static void CopieFichier(const QString& from, const QString& to)
{
    std::ifstream in(from, std::ios::binary);
    std::ofstream out(to, std::ios::binary);
    
    char temp;
    
    in.read( &temp, 1);
    
    while (!in.eof())
    {
	out.write(&temp, 1);
	in.read(&temp, 1);
    }
    
    out.close();
    in.close();
}




/*------------------------------------------------------------------
  Fonction :	CompareFichiers

  Description :	Fonction qui compare deux fichiers

  Paramètres :
	 const QString& nom1 : nom du premier fichier
	 const QString& nom2 : nom du second fichier

  Valeur retournée :	bool : vrai si les fichiers sont identiques

  Par : 2004-3-17 Martin Bisson, Anne-Marie Buki, Mylène Denis & Jean-François Pérusse
  MAJ: 
------------------------------------------------------------------*/

static bool CompareFichiers(const QString& nom1, const QString& nom2)
{
    std::ifstream Fic1(QString("terrains/") + nom1, std::ios::binary);
    std::ifstream Fic2(QString("terrains/") + nom2, std::ios::binary);
    char c1, c2;
    
    Fic1.read(&c1, 1);
    Fic2.read(&c2, 1);
    
    while (!Fic1.eof() && !Fic2.eof() && c1 == c2)
    {
	Fic1.read(&c1, 1);
	Fic2.read(&c2, 1);
    }
    
    bool retour = Fic1.eof() && Fic2.eof();
    
    Fic1.close();
    Fic2.close();
    
    return retour;
}




/*------------------------------------------------------------------
  Fonction :	ChoixTerrainForm::Termine

  Description :	Fonction qui gère la sortie de la form ChoixTerrainForm

  Paramètres :

  Valeur retournée :	void : 

  Par : 2004-3-17 Martin Bisson, Anne-Marie Buki, Mylène Denis & Jean-François Pérusse
  MAJ: 
------------------------------------------------------------------*/
void ChoixTerrainForm::Termine()
{
    unsigned int i;
    bool over = true;
    
    for (i = 0; i < LesTrous.size(); i++)
    {
	if (LesTrous[i] == "")
	    over = false;
    }
    
    if (!over)  // Si le parcours n'est pas terminé
    {
	int reponse;
	reponse = QuitterEditeurForm::getChoix(this);
	
	if (reponse == 2)
	    reject();
	
	if (reponse == 0)// Si on complète par des trous au hasard
	{	  
	    over = true;
	    
	    int i, j;
	    QDir lerep("terrains");
	    lerep.setFilter(QDir::Files);
	    lerep.setNameFilter("*.png");
	    std::vector<QString> FichiersDedans;
	    
	    for (i = 0; i < lerep.count(); i++)
	    {
		QString toadd = lerep[i];
		toadd.remove(toadd.length()-4,4);
		
		bool estla = false;
		
		for (j = 0; j < FichiersDedans.size() && !estla; j++)
		{
		    estla = CompareFichiers(toadd, FichiersDedans[j]);
		}
		if (!estla)
		    FichiersDedans.push_back(toadd);
	    }
	    
	    QString nouveau, No;
	    
	    srand(time(0));
	    
	    for (i = 0; i < LesTrous.size(); i++)
	    {
		if (LesTrous[i] == "")
		{
		    // Choisir un trou random
		    nouveau = FichiersDedans[rand() % FichiersDedans.size()];
		    
		    if (i < 9)
			No = "0";
		    else
			No = "";
		    
		    No += QString::number(i+1);
		    
		    LesTrous[i] = fichierouvert + "___" + No;
		    
		    CopieFichier(QString("terrains/") + nouveau,
				 QString("terrains/") + LesTrous[i]);
		    CopieFichier(QString("terrains/") + nouveau + ".png",
				 QString("terrains/") + LesTrous[i] + ".png");
		}
	    }
	}
    }
    
    if (over)  // On enregistre le parcours
    {
	std::ofstream Fic;
	Fic.open(QString("parcours/") + fichierouvert);
	Fic << "carmonip" << std::endl;
	Fic << LesTrous.size() << std::endl;
	for (i = 0; i < LesTrous.size(); i++)
	{
	    Fic << LesTrous[i].ascii() << std::endl;
	}
	Fic.close();
	accept();
    }
}




/*------------------------------------------------------------------
  Fonction :	ChoixTerrainForm::setFichierouvert

  Description :	Assigne une valeur à fichierouvert

  Paramètres :
	 const QString& fic : Nouveau fichier ouvert

  Valeur retournée :	void : 

  Par : 2004-3-17 Martin Bisson, Anne-Marie Buki, Mylène Denis & Jean-François Pérusse
  MAJ: 
------------------------------------------------------------------*/
void ChoixTerrainForm::setFichierouvert( const QString& fic )
{
    fichierouvert = fic;
}




/*------------------------------------------------------------------
  Fonction :	ChoixTerrainForm::construitpreview

  Description :	Fonction qui construit les aperçus des trous à partir des fichiers.

  Paramètres :

  Valeur retournée :	void : 

  Par : 2004-3-17 Martin Bisson, Anne-Marie Buki, Mylène Denis & Jean-François Pérusse
  MAJ: 
------------------------------------------------------------------*/
void ChoixTerrainForm::construitpreview()
{
    LesPreviews.clear();
    
    for (int i = 0; i < (int)LesTrous.size(); i++)
    {
	QPixmap pix(128, 128);
	QPainter paint;
	
	// si ce terrain est vide
	if (LesTrous[i] == "")
	{
	    pix.fill();
	}
	else
	{
	    pix.load(QString("terrains/") + LesTrous[i] + ".png", "PNG");
	}
	paint.begin(&pix);
	{
	    QString Msg = QString("Trou ") + QString::number(i+1);
	    
	    paint.setFont(QFont("Helvetica", 14, QFont::Bold));
	    paint.setPen(QColor(0,0,0));
	    int x = (pix.width() - paint.fontMetrics().width(Msg))/2;
	    int y = (pix.height() + paint.fontMetrics().height())/2;
	    paint.drawText(x+1,y+1,Msg);
	    
	    paint.setFont(QFont("Helvetica", 14, QFont::Bold));
	    paint.setPen(QColor(217,119,14));
	    paint.drawText(x,y,Msg);
	}
	paint.end();
	
	LesPreviews.push_back(pix);
    }
    
    UpdatePreview();
}




/*------------------------------------------------------------------
  Fonction :	ChoixTerrainForm::setTrous

  Description :	Assigne une nouvelle valeur à LesTrous

  Paramètres :
	 const std::vector<QString> & newtrous : Nouveaux LesTrous

  Valeur retournée :	void : 

  Par : 2004-3-17 Martin Bisson, Anne-Marie Buki, Mylène Denis & Jean-François Pérusse
  MAJ: 
------------------------------------------------------------------*/
void ChoixTerrainForm::setTrous( const std::vector<QString> & newtrous)
{
    LesTrous = newtrous;
}

#define VALIDE		\
if (Fic.fail() || Fic.eof())	\
{			\
			Fic.close();	\
			return false;	\
		    }





/*------------------------------------------------------------------
  Fonction :	ChoixTerrainForm::ChargeTrous

  Description :	Fonction qui charge les trous du parcours

  Paramètres :

  Valeur retournée :	bool : vrai si le parcours est valide

  Par : 2004-3-17 Martin Bisson, Anne-Marie Buki, Mylène Denis & Jean-François Pérusse
  MAJ: 
------------------------------------------------------------------*/
bool ChoixTerrainForm::ChargeTrous()
{
    char buffer[100];
    std::ifstream Fic(QString("parcours/") + fichierouvert);
    VALIDE
	    
    Fic.getline(buffer, 99);
    if (strcmp(buffer, "carmonip") != 0)
    {
	Fic.close();
	return false;
    }
    
    int NbTrou;
    Fic >> NbTrou;
    Fic.ignore();
    VALIDE
    if (NbTrou != 9 && NbTrou != 18)
    {
	Fic.close();
	return false;
    }
    
    std::vector<QString> temptrous;
    
    for (int i = 0; i < NbTrou; i++)
    {
	VALIDE
		Fic.getline(buffer, 99);
	temptrous.push_back(QString(buffer));
    }
    
    Fic.close();
    
    LesTrous = temptrous;
    if (LesTrous.size() == 18)
    {
	ChangePushButton->show();
    }
    else
    {
	ChangePushButton->hide();
    }
    
    adjustSize();
    
    return true;
}




/*------------------------------------------------------------------
  Fonction :	ChoixTerrainForm::UpdatePreview

  Description :	Met à jour les aperçus des trous

  Paramètres :

  Valeur retournée :	void : 

  Par : 2004-3-17 Martin Bisson, Anne-Marie Buki, Mylène Denis & Jean-François Pérusse
  MAJ: 
------------------------------------------------------------------*/
void ChoixTerrainForm::UpdatePreview()
{
    int Debut = (view1a9) ? 0 : 9;
    
    terrainPushButton1->setPixmap(LesPreviews[Debut+0]);
    terrainPushButton2->setPixmap(LesPreviews[Debut+1]);
    terrainPushButton3->setPixmap(LesPreviews[Debut+2]);
    terrainPushButton4->setPixmap(LesPreviews[Debut+3]);
    terrainPushButton5->setPixmap(LesPreviews[Debut+4]);
    terrainPushButton6->setPixmap(LesPreviews[Debut+5]);
    terrainPushButton7->setPixmap(LesPreviews[Debut+6]);
    terrainPushButton8->setPixmap(LesPreviews[Debut+7]);
    terrainPushButton9->setPixmap(LesPreviews[Debut+8]);
}




/*------------------------------------------------------------------
  Fonction :	ChoixTerrainForm::changePage

  Description :	Change de page pour afficher l'autre tranche de 9 trous

  Paramètres :

  Valeur retournée :	void : 

  Par : 2004-3-17 Martin Bisson, Anne-Marie Buki, Mylène Denis & Jean-François Pérusse
  MAJ: 
------------------------------------------------------------------*/
void ChoixTerrainForm::changePage()
{
    view1a9 = !view1a9;
    if (view1a9)
    {
	ChangePushButton->setText("Voir les trous 10 à 18");
    }
    else
    {
	ChangePushButton->setText("Voir les trous 1 à 9");
    }
    UpdatePreview();
}




/*------------------------------------------------------------------
  Fonction :	ChoixTerrainForm::choisirterrain

  Description :	Fonction (slot) appelé lorsqu'on clique sur un terrain

  Paramètres :
	 int terrain : Numéro du terrain

  Valeur retournée :	void : 

  Par : 2004-3-17 Martin Bisson, Anne-Marie Buki, Mylène Denis & Jean-François Pérusse
  MAJ: 
------------------------------------------------------------------*/
void ChoixTerrainForm::choisirterrain( int terrain )
{
    frmEditeurTrou * ptrEditeur = 0;
    
    ptrEditeur = new frmEditeurTrou;
    
    terrain += (view1a9 ? 0 : 9);
    
    // Si le terrain est vide et n'a pas de nom, on lui assigne le nom 
    // du parcours + le numéro du terrain
    if (LesTrous[terrain] == "")
    {
	ptrEditeur->NouveauTerrain();
    }
    else
    {
	ptrEditeur->ChargerTerrain(QString("terrains/")+LesTrous[terrain]);
    }
    
    QString No("");
    if (terrain < 9)
    {
	No = "0";
    }
    No += QString::number(terrain+1);
    
    ptrEditeur->setFichierActif(fichierouvert + "___" + No);
    
    // Si on a fait des modifications, on update
    if (ptrEditeur->exec())
    {
	LesTrous[terrain] = ptrEditeur->getFichierActif();
	
	construitpreview();
    }
    
    delete ptrEditeur;
}



// Pour qu'on ne puisse pas fermer avec le petit x
void ChoixTerrainForm::closeEvent(QCloseEvent *)
{
    Termine();
}
