#include "enemy.h"
#include <fstream>
#include <sstream>

// Constructor
Enemy::Enemy(enemy_t enemy)
{
    // Obten punteros a objetos
    asset = enemy.asset;
    renderer = enemy.renderer;

    // Crea objetos
    texture = new LTexture();
    loadTextureFromFile(texture, asset->get(enemy.tileset), renderer);
    sprite = new AnimatedSprite(texture, renderer, asset->get(enemy.animation));

    // Obten el resto de valores
    p1 = enemy.p1;
    p2 = enemy.p2;
    sprite->setPosX(enemy.x);
    sprite->setPosY(enemy.y);
    sprite->setVelX(enemy.vx);
    sprite->setVelY(enemy.vy);

    // Inicializa el sprite con el resto de parametros comunes
    sprite->setWidth(enemy.w);
    sprite->setHeight(enemy.h);
    sprite->setCurrentAnimation("walk");
    sprite->setFlip(enemy.vx>0?SDL_FLIP_NONE:SDL_FLIP_HORIZONTAL);

    collider = getRect();
}

// Destructor
Enemy::~Enemy()
{
    texture->unload();
    delete texture;
    texture = nullptr;

    delete sprite;
    sprite = nullptr;
}

// Pinta el enemigo en pantalla
void Enemy::render()
{
    sprite->render();
}

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

// Comprueba si ha llegado al limite del recorrido para darse media vuelta
void Enemy::checkPath()
{
    if (sprite->getPosX() > p2.x || sprite->getPosX() < p1.x)
    {
        sprite->setVelX(sprite->getVelX() * (-1));
        sprite->flip();
    }

    if (sprite->getPosY() > p2.y || sprite->getPosY() < p1.y)
    {
        sprite->setVelY(sprite->getVelY() * (-1));
        sprite->flip();
    }
}

// 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;
}