#pragma once

#include <SDL2/SDL.h>
#include "jail_audio.h"
#include "utils.h"
#include "input.h"
#include "animatedsprite.h"
#include "asset.h"
#include "map.h"

#ifndef PLAYER_H
#define PLAYER_H

enum e_state
{
	standing,
	jumping,
	falling
};

// The player
class Player
{
public:
	Asset *asset;			// Objeto con la ruta a todos los ficheros de recursos
	SDL_Renderer *renderer; // El renderizador de la ventana
	Input *input;			// Objeto Input para gestionar las entradas
	AnimatedSprite *sprite; // Objeto con los graficos, animaciones y posición del jugador
	LTexture *texture;		// Textura con los graficos del jugador
	Map *map;				// Objeto con el mapa

	float x;				// Posición del jugador en el eje X
	float y;				// Posición del jugador en el eje Y
	float vx;				// Velocidad/desplazamiento del jugador en el eje X
	float vy;				// Velocidad/desplazamiento del jugador en el eje Y
	bool jumpPressed;		// Indica si esta pulsada la tecla de salto
	bool enabled;			// Si está habilitado
	bool invulnerable;		// Indica si se encuentra en estado invulnerable
	int coins;				// Cantidad de monedas
	int cooldown;			// Tiempo de inhabilitación
	int lives;				// Cantidad de vidas
	int w;					// Ancho del jugador
	int h;					// ALto del jugador
	e_state state;			// Estado actual del jugador
	e_border border;		// Indica en qué borde de la pantalla está el jugador
	SDL_Point lastPosition; // Posición anterior

	// Variables que afectan a la inercia del movimiento
	float jumpStrenght; // Cantidad de pixels a desplazarse y velocidad que pilla al saltar
	float gravity;		// Gravedad
	float accelX;		// Aceleración al desplazarse horizontalmente
	float maxVX;		// Velocidad mazima de desplazamiento horizontal
	float maxVY;		// Velocidad mazima de desplazamiento vertical

	std::vector<bool> key;			  // Indica las llaves que posee el jugador
	std::vector<SDL_Point> collider;  // Contiene los puntos de colisión del jugador con el mapa
	std::vector<SDL_Point> underFeet; // Contiene los puntos que hay bajo cada pie del jugador
	JA_Sound sound_coin;			  // Sonido al coger monedas
	JA_Sound sound_death;			  // Sonido al morir
	JA_Sound sound_jump;			  // Sonido al saltar

	// Comprueba las entradas y modifica variables
	void checkInput();

	// Aplica la gravedad
	void addGravity();

	// Actualiza los puntos de colisión
	void updateColliders();

	// Actualiza los puntos de los pies
	void updateFeet();

	// Compruena las colisiones con el mapa
	bool checkMapCollisions();

	// Mueve al jugador en función de la velocidad/desplazamiento
	void move();

	// Anima al jugador
	void animate();

	// Comprueba si el jugador tiene suelo debajo de los pies
	bool isOnFloor();

public:
	// Constructor
	Player(SDL_Renderer *renderer, Asset *asset, Input *input, Map *map);

	// Destructor
	~Player();

	// Actualiza todas las variables
	void update();

	// Dibuja el objeto
	void render();

	// Comprueba si está situado en alguno de los cuatro bordes de la habitación
	bool isOnScreenBorder();

	// Devuelve el valor de la variable
	e_border getBorder();

	// Cambia al jugador de un borde al opuesto. Util para el cambio de pantalla
	void switchBorders();

	// Pasa la referencia del mapa
	void setMap(Map *map);
};

#endif
