MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    this->running = true;
    this->setFocus();
    setFixedSize(GAME_WIDTH,GAME_HEIGHT);
    ui->backgroundFrame->setFixedSize(GAME_WIDTH,GAME_HEIGHT);
    //inicializacion atributos

    AspectRatioPixmapLabel* labelprueba = new AspectRatioPixmapLabel();
    QPixmap pixPrueba(":/gameElement/assets/spaceship1.png");
    labelprueba->setPixmap(pixPrueba);
    labelprueba->setFixedSize(50,50);
    labelprueba->setParent(this);
    labelprueba->show();
    labelprueba->move(GAME_WIDTH/2,GAME_HEIGHT- 70);
    labelprueba->setScaledContents(true);

    player = newPlayerShip(labelprueba);
    playerBullets = new QList<PlayerBeam*>();
    enemies = new QList<enemy_T*>();
    scoreNumbers = new QList<QLabel*>();
    Lives = new QList<QLabel*>();

    //Inicializacion variables misc
    numbers[0] = ":/miscelanious/assets/numeral0.png";
    numbers[1] = ":/miscelanious/assets/numeral1.png";
    numbers[2] = ":/miscelanious/assets/numeral2.png";
    numbers[3] = ":/miscelanious/assets/numeral3.png";
    numbers[4] = ":/miscelanious/assets/numeral4.png";
    numbers[5] = ":/miscelanious/assets/numeral5.png";
    numbers[6] = ":/miscelanious/assets/numeral6.png";
    numbers[7] = ":/miscelanious/assets/numeral7.png";
    numbers[8] = ":/miscelanious/assets/numeral8.png";
    numbers[9] = ":/miscelanious/assets/numeral9.png";

    //----------------------------------

    //
    generateNextLevel();

    //Asignación de los Threads
    this->gameloop = new GameLoopThread(true);

    //Connects necesarios para el funcionamiento
    connect(gameloop,SIGNAL(gameUpdate()),this,SLOT(gameUpdate()));
    connect(gameloop,SIGNAL(gameRender()),this,SLOT(gameRender()));
    connect(gameloop,SIGNAL(gameDrawn()),this,SLOT(gameDrawn()));

    this->gameloop->start();

}
TrapezoidalIntegrator::NodesAndWeights TrapezoidalIntegrator::iterateLevel(const NodesAndWeights& old) const {
  return isLevelZero(old) ? generateLevelOne() : generateNextLevel(old);
}
void MainWindow::gameUpdate()
{
    //update jugador
    updateShip(this->player);

    //update bullets
    for(int i = 0; i < playerBullets->size(); i++)
    {
        bool remove = UpdatePlayerBeam(playerBullets->at(i));

        if(remove)
        {
            delete playerBullets->at(i)->myLabel;
            playerBullets->removeAt(i);
            i--;

        }
    }
    for(int i= 0; i < enemies->size(); i++)
    {
        enemyUpdate(enemies->at(i));
    }

    QRect Rectplayer = player->myLabel->geometry();
    //Checkeo Colisiones
    for(int i = 0; i < playerBullets->size(); i++)
    {
        PlayerBeam* bullet = playerBullets->at(i);
        QRect Rectbullet = bullet->myLabel->geometry();

        if(Rectbullet.intersects(Rectplayer))
        {
            player->lives--;
            delete bullet->myLabel;
            playerBullets->removeAt(i);
            i--;
        }

        for(int j = 0; j < enemies->size(); j++)
        {
             enemy_T* actEnemy = enemies->at(j);
             QRect RectActEnemy = actEnemy->image->geometry();
             if(Rectbullet.intersects(RectActEnemy))
             {
                 hit(actEnemy);
                 delete bullet->myLabel;
                 playerBullets->removeAt(i);
                 i--;
                 break;
             }
        }

    }
    //Colisiones con el jugador


    for(int i = 0; i < enemies->size(); i++)
    {

        QRect RectActEnemy = enemies->at(i)->image->geometry();
        if(Rectplayer.intersects(RectActEnemy))
        {
            playerHitted = true;
            player->lives--;
            qDebug() << player->lives;
            hit(enemies->at(i));
        }
    }



    //check gmae over
    if(player->lives <= 0)
    {
         emit gameEnd();
    }

    //Checkeo Muerte de Enemigos
    for(int i = 0; i < enemies->size(); i++)
    {
        if(enemies->at(i)->dead)
        {
            delete enemies->at(i)->image;
            player->score += checkEnemyValue(enemies->at(i)->type);
            enemies->removeAt(i);
            i--;
            this->enemyKilled = true;
        }
    }

    if(enemies->size() == 0)
    {
        this->level++;
        generateNextLevel();
    }

    refreshScore();
    refreshLives();

}