#pragma once
#include <SDL2/SDL.h>
#include "utils.h"
#include "asset.h"
#include "animatedsprite.h"
#include <string>

#ifndef ENEMY_H
#define ENEMY_H

/*
Un enemigo deberia tener la siguiente informacion:
POSICION INICIAL
VELOCIDAD EN X
VELOCIDAD EN Y
PUNTO X1 Y PUNTO X2 DEL RECORRIDO
PUNTO Y1 Y PUNTO Y2 DEL RECORRIDO
COLOR
PNG ASOCIADO
FICHERO descriptor del enemigo

Por convención, todos los enemigos dispondran de 4 frames de animacion
Se invertirá el sprite en funcion de la velocidad de X
*/

// Estructura para pasar los datos de un enemigo
struct enemy_t
{
	SDL_Renderer *renderer; // El renderizador de la ventana
	Asset *asset;			// Objeto con la ruta a todos los ficheros de recursos
	std::string tileset;	// Fichero con los graficos del enemigo
	std::string animation;	// Fichero con las animaciones del enemigo
	int w;					// Anchura del enemigo
	int h;					// Altura del enemigo
	float x;				// Posición inicial en el eje X
	float y;				// Posición inicial en el eje Y
	float vx;				// Velocidad en el eje X
	float vy;				// Velocidad en el eje Y
	int x1;					// Limite izquierdo de la ruta en el eje X
	int x2;					// Limite derecho de la ruta en el eje X
	int y1;					// Limite superior de la ruta en el eje Y
	int y2;					// Limite inferior de la ruta en el eje Y
	color_t color;			// Color del enemigo
};

// Clase Enemy
class Enemy
{
private:
	LTexture *texture;		// Textura con los graficos del enemigo
	AnimatedSprite *sprite; // Sprite del enemigo

	SDL_Renderer *renderer; // El renderizador de la ventana
	Asset *asset;			// Objeto con la ruta a todos los ficheros de recursos
	color_t color;			// Color del enemigo
	int x1;					// Limite izquierdo de la ruta en el eje X
	int x2;					// Limite derecho de la ruta en el eje X
	int y1;					// Limite superior de la ruta en el eje Y
	int y2;					// Limite inferior de la ruta en el eje Y
	SDL_Rect collider;		// Caja de colisión

	// Comprueba si ha llegado al limite del recorrido para darse media vuelta
	void checkPath();

public:
	// Constructor
	Enemy(enemy_t enemy);

	// Destructor
	~Enemy();

	// Pinta el enemigo en pantalla
	void render();

	// Actualiza las variables del objeto
	void update();

	// Devuelve el rectangulo que contiene al enemigo
	SDL_Rect getRect();

	// Obtiene el rectangulo de colision del enemigo
	SDL_Rect &getCollider();

	// Recarga la textura
	void reLoadTexture();
};

#endif
