#include "enemy.h"

// Constructor
Enemy::Enemy(enemy_t enemy)
{
    // Crea objetos
    sprite = new AnimatedSprite(enemy.renderer, enemy.animation);

    // Obten el resto de valores
    x1 = enemy.x1;
    x2 = enemy.x2;
    y1 = enemy.y1;
    y2 = enemy.y2;
    palette = enemy.palette;
    colorString = enemy.color;
    color = stringToColor(palette, colorString);
    sprite->setPosX(enemy.x);
    sprite->setPosY(enemy.y);
    sprite->setVelX(enemy.vx);
    sprite->setVelY(enemy.vy);
    sprite->setWidth(enemy.w);
    sprite->setHeight(enemy.h);
    doFlip = enemy.flip;
    mirror = enemy.mirror;
    if (doFlip)
    {
        if (enemy.vx < 0.0f)
        {
            sprite->setFlipH(true);
        }
    }
    sprite->setFlipV(mirror);

    collider = getRect();

    // Coloca un frame al azar o el designado
    if (enemy.frame == -1)
    {
        sprite->setCurrentFrame(rand() % sprite->getNumFrames());
    }
    else
    {
        sprite->setCurrentFrame(std::min(enemy.frame, sprite->getNumFrames() - 1));
    }
}

// Destructor
Enemy::~Enemy()
{
    delete sprite;
}

// Pinta el enemigo en pantalla
void Enemy::render()
{
    sprite->getTexture()->setColor(color.r, color.g, color.b);
    sprite->render();
    sprite->getTexture()->setColor(255, 255, 255);
}

// Actualiza las variables del objeto
void Enemy::update()
{
    sprite->update();
    checkPath();
    collider = getRect();
}

// Comprueba si ha llegado al limite del recorrido para darse media vuelta
void Enemy::checkPath()
{
    if (sprite->getPosX() > x2 || sprite->getPosX() < x1)
    {
        // Recoloca
        if (sprite->getPosX() > x2)
        {
            sprite->setPosX(x2);
        }
        else
        {
            sprite->setPosX(x1);
        }

        // Cambia el sentido
        sprite->setVelX(sprite->getVelX() * (-1));

        // Invierte el sprite
        if (doFlip)
        {
            sprite->flipH();
        }
    }

    if (sprite->getPosY() > y2 || sprite->getPosY() < y1)
    {
        // Recoloca
        if (sprite->getPosY() > y2)
        {
            sprite->setPosY(y2);
        }
        else
        {
            sprite->setPosY(y1);
        }

        // Cambia el sentido
        sprite->setVelY(sprite->getVelY() * (-1));

        // Invierte el sprite
        if (doFlip)
        {
            sprite->flipH();
        }
    }
}

// Devuelve el rectangulo que contiene al enemigo
SDL_Rect Enemy::getRect()
{
    return sprite->getRect();
}

// Obtiene el rectangulo de colision del enemigo
SDL_Rect &Enemy::getCollider()
{
    return collider;
}

// Recarga la textura
void Enemy::reLoadTexture()
{
    sprite->getTexture()->reLoad();
}

// Asigna la paleta
void Enemy::setPalette(palette_e pal)
{
    palette = pal;
    color = stringToColor(palette, colorString);
}