#include <iostream>
#include <SDL/SDL.h>

#include <ctime>
#include <cstdlib>

#include "PluieFlamme.h"
/*
#include <deque>*/

using namespace std;

int main ( int argc, char** argv )
{
    /// [1] Démarrage
    // [1.1] Démarrages SDL
    if ( SDL_Init( SDL_INIT_VIDEO ) < 0)
    {
        cout << "Impossible d'initialiser la SDL: " << SDL_GetError() << endl;
        return 1;
    }

    // [1.2] Préparation de fermeture
    atexit(SDL_Quit);

    // [1.3] Para-fenêtre
    SDL_WM_SetCaption("Application SDL", 0);

    /// [2] Préparation des composants
    // [2.1] Préparation de la fenêtre
    int largeur(640);
    int hauteur(480);
    SDL_Surface* screen = SDL_SetVideoMode(largeur, hauteur, 32,
                                           SDL_HWSURFACE|SDL_DOUBLEBUF);
    if ( !screen )
    {
        cout << "Unable to set 640x480 video: " << SDL_GetError() << endl;
        return 1;
    }

    // [2.2] Préparation
    DoubleAxe souris;
    Uint32 tempsPrecedent;

    Uint8 rouge(0);
    Uint8 vert(0);
    Uint8 bleu(0);
    Uint32 couleur;
    PluieFlamme* boum(0);

    int nbPop, power,  rayon;
    float graviteY, resistance;

    // [2.3] Requête de parmètres
    cout << "Entrez les paramètres."<< endl;
    cout << "Nombre de particules par salve: ";
    cin >> nbPop;
    cout << "Puissance de dissipation des particules (defaut 5): ";
    cin >> power;
    cout << "Gravité (défaut 0.5): ";
    cin >> graviteY;
    cout << "Rayon des particules (défaut 12): ";
    cin >> rayon;
    cout << "Resistance de l'air (défaut 0.98): ";
    cin >> resistance;
    cout << "Démarrage du lanceur chinois." << endl;

    /// [3] Boucle principale
    bool done = false;
    while (!done)
    {
        // [3.1] Gestion évènements
        SDL_Event event;
        while (SDL_PollEvent(&event))
        {
            switch (event.type)
            {
            case SDL_QUIT:
                done = true;
                break;
            case SDL_KEYDOWN:
                if (event.key.keysym.sym == SDLK_ESCAPE)
                    done = true;
                break;
            case SDL_MOUSEBUTTONDOWN:
                if (event.button.button==SDL_BUTTON_LEFT && boum==0)
                {
                    souris.x=event.button.x;
                    souris.y=event.button.y;
                    boum = new PluieFlamme(souris, nbPop, power, graviteY, rayon, couleur, resistance);
                }
                break;
            case SDL_MOUSEMOTION:
                vert = event.motion.x*255/largeur;
                rouge = event.motion.y*255/hauteur;
                if ((int)vert+rouge > 255)
                    bleu = 0;
                else
                    bleu = 255-vert-rouge;

                couleur=SDL_MapRGB(screen->format,rouge,vert,bleu);
                break;
            } // end switch event type
        } // end of message processing

        // [3.2] Calculs
        //nettoyer
        if (boum!=0 && boum->estFini(screen))
        {
            delete boum;
            boum = 0;
        }

        // [3.3] Dessin des composants
        SDL_FillRect(screen, 0, SDL_MapRGB(screen->format, 0, 0, 0));

        if (boum!=0)
        {
            boum->deplacement();
            boum->dessiner(screen);
        }

        SDL_Flip(screen);

        // [3.4] Gestion du temps
        if (SDL_GetTicks()-tempsPrecedent > 40)
            cout << "Temps de calcul trop long ! Cadence dépassée de "
            <<SDL_GetTicks()-tempsPrecedent-40
            <<" mili secondes." << endl;
        while (40>SDL_GetTicks()-tempsPrecedent)
        {
            //ça bloque pendant 30 ms moins le temps de calcul
        }
        tempsPrecedent=SDL_GetTicks();

    } //fin bcl principale

    ///[4] Destruction des composants
    SDL_FreeSurface(screen);
    if (boum!=0)
        delete boum;

    cout << "Aucune erreur détectée." << endl;
    return 0;
}
