#include <vector>
#include <iostream>
#include <stdexcept>
#include <cstdlib>
#include <ctime>

#include "Moteur.h"
#include "Image.h"
#include "Avatar.h"
#include "Ennemi.h"
#include "Dictionnaire.h"
#include "Niveau.h"

using namespace std;

int main(int, char**) 
{
  
  Moteur moteur("Mon super jeu vidéo", 2); 

  std::srand(static_cast<unsigned>(std::time(nullptr)));

  
  Image fond;
  bool fondCharge = false;

  try {
      fond = Image(moteur, "./assets/fond.png");
      fondCharge = true;
  } catch (runtime_error&) {
      cerr << "Erreur chargement du fond" << endl;
  }


  Image gameover;
  bool gameoverCharge = false;
  Image bravo;
  bool bravoCharge = false;

  try {
      gameover = Image(moteur, "./assets/gameover.png");
      gameoverCharge = true;
  } catch (runtime_error&) {
      cerr << "Erreur chargement du gameover" << endl;
  }

  try {
      bravo = Image(moteur, "./assets/bravo.png");
      bravoCharge = true;
  } catch (runtime_error&) {
      cerr << "Erreur chargement du bravo" << endl;
  }

  Dictionnaire dictionnaire("./assets/dictionnaire.txt");
  Image tuiles(moteur, "./assets/objets.png");
  Niveau niveau(tuiles, "./assets/niveau.txt", dictionnaire);

  
  Avatar heros(moteur,
               "./assets/personnages.png",
               TAILLE_CASE, 2 * TAILLE_CASE,
               3, 0,
               BAS);


  Ennemi ennemi1(moteur,
                 "./assets/personnages.png",
                 5 * TAILLE_CASE, TAILLE_CASE,
                 0, 4,
                 BAS);


  Ennemi ennemi2(moteur,
                 "./assets/personnages.png",
                 TAILLE_CASE, 5 * TAILLE_CASE,
                 9, 0,
                 DROITE);

  Ennemi ennemi3(moteur,
                 "./assets/personnages.png",
                 2 * TAILLE_CASE, 5 * TAILLE_CASE,
                 3, 4,
                 GAUCHE);

  Ennemi ennemi4(moteur,
                 "./assets/personnages.png",
                 9 * TAILLE_CASE, 7 * TAILLE_CASE,
                 9, 0,
                 BAS);

  Ennemi ennemi5(moteur,
                 "./assets/personnages.png",
                 8 * TAILLE_CASE, 2 * TAILLE_CASE,
                 0, 4,
                 GAUCHE);

  Ennemi ennemi6(moteur,
                 "./assets/personnages.png",
                 3 * TAILLE_CASE, 7 * TAILLE_CASE,
                 9, 4,
                 HAUT);

  Ennemi ennemi7(moteur,
                 "./assets/personnages.png",
                 7 * TAILLE_CASE, 7 * TAILLE_CASE,
                 9, 0,
                 DROITE);

  bool quitter = false;
  bool defaite = false;
  bool victoire = false;

  
  while (!quitter)
  {
    Evenement evenement = moteur.evenementRecu();
    while (evenement != AUCUN)
    {
      switch (evenement)
      {
        case QUITTER_APPUYE:
          quitter = true;
          break;

        case GAUCHE_APPUYE:
          heros.allerGauche(niveau);
          niveau.testerBonusEtPrendre(heros.getX(), heros.getY());
          break;

        case DROITE_APPUYE:
          heros.allerDroite(niveau);
          niveau.testerBonusEtPrendre(heros.getX(), heros.getY());
          break;

        case HAUT_APPUYE:
          heros.allerHaut(niveau);
          niveau.testerBonusEtPrendre(heros.getX(), heros.getY());
          break;

        case BAS_APPUYE:
          heros.allerBas(niveau);
          niveau.testerBonusEtPrendre(heros.getX(), heros.getY());
          break;

        default:
          break;
      }

      evenement = moteur.evenementRecu();
    }

    

    
    bool majAnim = moteur.animationsAmettreAjour();
    if (majAnim)
    {
      heros.mettreAjourAnimation();
      ennemi1.mettreAjourAnimation();
      ennemi2.mettreAjourAnimation();
      ennemi3.mettreAjourAnimation();
      ennemi4.mettreAjourAnimation();
      ennemi5.mettreAjourAnimation();
      ennemi6.mettreAjourAnimation();
      ennemi7.mettreAjourAnimation();

      ennemi1.avancer(niveau);
      ennemi2.avancer(niveau);
      ennemi3.avancer(niveau);
      ennemi4.avancer(niveau);
      ennemi5.avancer(niveau);
      ennemi6.avancer(niveau);
      ennemi7.avancer(niveau);
    }

    
    if (!defaite && (heros.touche(ennemi1) || heros.touche(ennemi2)  || heros.touche(ennemi3) ||
        heros.touche(ennemi4)  || heros.touche(ennemi5)  || heros.touche(ennemi6)
        || heros.touche(ennemi7)))
    {
      defaite = true;
      quitter = true;
    }

    if (!defaite && !victoire && niveau.gagne())
    {
      victoire = true;
      quitter = true;
    }

    

    moteur.initialiserRendu(); 

    
    if (fondCharge)
      fond.dessiner(0, 0);

    
    niveau.dessiner();

    
    heros.dessiner();
    ennemi1.dessiner();
    ennemi2.dessiner();
    ennemi3.dessiner();
    ennemi4.dessiner();
    ennemi5.dessiner();
    ennemi6.dessiner();
    ennemi7.dessiner();

    if (defaite && gameoverCharge)
      gameover.dessiner(0, 0);
    else if (victoire && bravoCharge)
      bravo.dessiner(0, 0);

    








    






    moteur.finaliserRendu();
    if (quitter && (defaite || victoire))
      moteur.attendre(2.0);
  }

  return 0;
}
