#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"
#include "actor.h"

#ifndef PLAYER_H
#define PLAYER_H

enum e_state
{
	s_standing,
	s_jumping,
	s_falling
};

enum e_floor
{
	f_none,
	f_wall,
	f_platform
};

// 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
	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
	int hookedOnMovingPlatform; // Índice de la plataforma movil a la que está enganchado
	e_floor isOn;				// Indica sobre que tipo de suelo se encuentra

	// Variables que afectan a la inercia del movimiento
	bool jumpPressed;	// Indica si esta pulsada la tecla de salto
	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

	int diamonds;					  // Cantidad de diamantes recogidos por el jugador
	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();

	// Comprueba si el jugador tiene una plataforma movil bajo sus pies
	bool isOnMovingPlatform();

	// Comprueba las interacciones con los actores
	int checkActors();

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
