#include "gestionnaireNiveaux.h"

GestionnaireNiveaux::GestionnaireNiveaux(SDL_Surface *screen):
m_pageActuelle(0),m_estChoisi(false),m_choixJoueur("nothings"),m_screen(screen), m_font(0), m_pagePrecedente(0), m_pageSuivante(0)
{
    ///[1] Création des boutons
    //[1.1] Changement de pages
    m_pagePrecedente = new Bouton(SDL_LoadBMP("Images/gauche.bmp"), screen, 300-154, 560);
    m_pageSuivante = new Bouton(SDL_LoadBMP("Images/droite.bmp"), screen, 300, 560);

    //[1.2] Niveaux
    for (int i(0); i<NB_BOUTONS; i++)
    {
        m_tableauBoutons[i]=0;
    }
    allerALaPage(0);

    ///[2] Attribution des secondes images
    //[2.1] Changement de pages

    //[2.2] Niveaux (pas besoin, fait dans allerPage())


}///GestionnaireNiveaux()

GestionnaireNiveaux::~GestionnaireNiveaux()
{
    ///[1] Nettoyage boutons
    //[1.1] Changement de pages
    delete(m_pagePrecedente);
    delete(m_pageSuivante);

    //[1.2] Niveaux
    reinitialiserPage();

}///~GestionnaireNiveaux()

void GestionnaireNiveaux::calculer(int const xSouris, int const ySouris)
{
    bool selectOk(false);//Rien de selectionné
    for (int i(0); i<NB_BOUTONS; i++)
    {
        if (m_tableauBoutons[i]->calculer(xSouris,ySouris))
        {
            m_font=m_apercu[i];
            selectOk=true;
        }
    }
    if (!selectOk)//Rien de selectionné !
        m_font=0;
}///calculer(int const xSouris, int const ySouris)

void GestionnaireNiveaux::afficher()
{
    ///[1] Affichage des boutons
    //[1.0] Font
    if (m_font!=0)
        SDL_BlitSurface(m_font,0,m_screen,0);

    //[1.1] Changeurs de pages
    m_pagePrecedente->afficher();
    m_pageSuivante->afficher();

    //[1.2] Niveaux
    for (int i(0); i<NB_BOUTONS; i++)
    {
        m_tableauBoutons[i]->afficher();
    }

}///afficher(SDL_Surface* screen)

void GestionnaireNiveaux::clic(int const xSouris, int const ySouris)
{
    ///Teste tous les boutons, si un bouton est cliqué,
    ///appelez nomDuFichier puis modifier m_choixJoueur et m_estChoisi
    //[1] Test du tableau de boutons
    for (Uint8 i(0); i<NB_BOUTONS; i++)
    {
        if (m_tableauBoutons[i]->estClique(xSouris,ySouris))
        {
            std::cout << "Clic, niveau choisi: " << nomDuFichier(i) << std::endl;
            if (m_apercu[i]!=0)
            {
                m_estChoisi=true;
                m_choixJoueur=nomDuFichier(i);
            }
            else
                std::cout << nomDuFichier(i) << " n'existe pas. Reste au menu. " << std::endl;
        }
    }

	//[2] Tests des boutons de chgmt de page
	if (m_pageSuivante->estClique(xSouris,ySouris))
		allerALaPage(m_pageActuelle+1);
	else if (m_pagePrecedente->estClique(xSouris,ySouris) && m_pageActuelle>0)
		allerALaPage(m_pageActuelle-1);

}///clic(int const xSouris, int const ySouris)

bool GestionnaireNiveaux::estChoisi()
{
    return m_estChoisi;
}///estChoisi()

std::string GestionnaireNiveaux::getChoix()
{
    return m_choixJoueur;
}///getChoix()

/**---------------------------------FONCTIONS INTERNES---------------------------------**/

void GestionnaireNiveaux::reinitialiserPage()
{
    for (int i(0); i<NB_BOUTONS; i++)
    {
        //[1] Nettoyage boutons
        if (m_tableauBoutons[i]!=0)
            delete m_tableauBoutons[i];
        m_tableauBoutons[i]=0;

        //[2] Nettoyage aperçus
        if (m_apercu[i]!=0)
            SDL_FreeSurface(m_apercu[i]);
        m_apercu[i]=0;
    }
}///reinitialiserPage()

void GestionnaireNiveaux::allerALaPage(Uint32 numeroPage)
{
    //[0] Sécurité:
    if (m_tableauBoutons[0]!=0)
        reinitialiserPage();

    //[1] Changement de page, toute !
    m_pageActuelle=numeroPage;

    //[2] Chargement des images !!!
    SDL_Surface* apparence[NB_BOUTONS];
    for (int i(0); i<NB_BOUTONS; i++)
    {
        apparence[i]=SDL_LoadBMP("Images/boutonLevel.bmp");
    }

    SDL_Surface* surbrillance[NB_BOUTONS];
    for (int i(0); i<NB_BOUTONS; i++)
    {
        surbrillance[i]=SDL_LoadBMP("Images/boutonLevelB.bmp");
    }

    //[2bis] Chargement des textes et aperçus !
    std::string nomNiveau[NB_BOUTONS];
    std::string ajout;
    Niveau maquette;

    for (int i(0); i<NB_BOUTONS; i++)
    {
        if (!maquette.creer(nomDuFichier(i)))//Niveau inexistant
        {
            nomNiveau[i]="NO_LVL";
            m_apercu[i]=0;
        }
        else
        {
            ajout=convertirEntierEnCaracteres(m_pageActuelle*NB_BOUTONS+i+1);
            nomNiveau[i]="Level "+ajout+" "+maquette.getNom();
            m_apercu[i]=SDL_CreateRGBSurface(SDL_HWSURFACE,600,600,16,0,0,0,0);
            maquette.afficher(m_apercu[i]);
        }
    }

    //[3] Collage des textes !
    SDL_Surface* texte[NB_BOUTONS];
    SDL_Rect position;
    position.x=20;
    position.y=4;
    SDL_Rect positionB;
    positionB.x=position.x+2;
    positionB.y=position.y+1;

    SDL_Color bleu={0,0,200};

    for (int i(0); i<NB_BOUTONS; i++)
    {
        texte[i]=transform(nomNiveau[i],25,bleu);

        SDL_BlitSurface(texte[i], 0, apparence[i], &position);
        SDL_BlitSurface(texte[i], 0, surbrillance[i], &positionB);
    }

    //[4] Création des boutons !!!
    int y(80);
    int x(300-276-7);
    for (int i(0); i<NB_BOUTONS; i++)
    {
        if (i==8)//Deuxième colonne !
        {
            x=300+7;
            y=80;
        }

        m_tableauBoutons[i]=new Bouton(apparence[i], m_screen, x, y);
        y+=38+16;

        m_tableauBoutons[i]->attribuerImg(surbrillance[i]);
    }

    //[5] On nettoie les déchets
    for (int i(0); i<NB_BOUTONS; i++)
    {
        SDL_FreeSurface(texte[i]);
    }

}///allerALaPage(Uint32 numeroPage)

std::string GestionnaireNiveaux::nomDuFichier(Uint8 IDTab)
{
    //[1] Quel niveau selectionné ?
    int numLvl;
    numLvl=m_pageActuelle*NB_BOUTONS+IDTab+1;

    //[2] Renvoi
    return "level "+convertirEntierEnCaracteres(numLvl)+".txt";

}///nomDuFichier(Uint8 IDTab)