#pragma once

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

#ifndef ENEMY_H
#define ENEMY_H

// Estructura para pasar los datos de un enemigo
struct enemy_t
{
	SDL_Renderer *renderer;		 // El renderizador de la ventana
	animatedSprite_t *animation; // Puntero a las animaciones del enemigo
	std::string animationString; // Ruta al fichero con la animación
	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
	bool flip;					 // Indica si el enemigo hace flip al terminar su ruta
	bool mirror;				 // Indica si el enemigo está volteado verticalmente
	int frame;					 // Frame inicial para la animación del enemigo
	std::string color;			 // Color del enemigo
	palette_e palette;			 // Paleta de colores
};

class Enemy
{
private:
	// Objetos y punteros
	AnimatedSprite *sprite; // Sprite del enemigo

	// Variables
	color_t color;			 // Color del enemigo
	std::string colorString; // Color del enemigo en formato texto
	palette_e palette;		 // Paleta de colores
	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
	bool doFlip;			 // Indica si el enemigo hace flip al terminar su ruta
	bool mirror;			 // Indica si el enemigo se dibuja volteado verticalmente

	// 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();

	// Asigna la paleta
	void setPalette(palette_e pal);
};

#endif
