#pragma once
#include "struct.h"
#include "animatedsprite.h"

#ifndef PLAYER_H
#define PLAYER_H

//The player
class Player
{
public:
	//Constructor
	Player();

	//Destructor
	~Player();

	//Iniciador
	void init(float x, int y, LTexture *texture, SDL_Renderer *renderer);

	//Comprueba la entrada (teclado, gamepad) y actua en consecuencia
	void checkInput(Uint8 input);
	
	//Mueve el jugador a la posición y animación que le corresponde
	void move();

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

	//Establece el estado del jugador
	void setStatus(int status);

	//Establece la animación correspondiente al estado
	void setAnimation();

	//Obtiene el valor de la variable
	int getPosX();
	
	//Obtiene el valor de la variable
	int getPosY();
	
	//Obtiene el valor de la variable
	int getWidth();
	
	//Obtiene el valor de la variable
	int getHeight();
	
	//Indica si el jugador puede disparar
	bool canFire();

	//Establece el valor de la variable
	void setFireCooldown(int time);

	//Actualiza el valor de la variable
	void updateCooldown();

	//Actualiza al jugador a su posicion, animación y controla los contadores
	void update();

	//Obtiene la puntuación del jugador
	int getScore();

	//Asigna un valor a la puntuación del jugador
	void setScore(int score);

	//Incrementa la puntuación del jugador
	void addScore(int score);

	//Obtiene el valor de la variable
	bool isAlive();

	//Establece el valor de la variable
	void setAlive(bool value);

	//Obtiene el valor de la variable
	float getScoreMultiplier();

	//Establece el valor de la variable
	void setScoreMultiplier(float value);

	//Aumenta el valor de la variable hasta un máximo
	void incScoreMultiplier();

	//Decrementa el valor de la variable hasta un mínimo
	void decScoreMultiplier();

	//Obtiene el circulo de colisión
	Circle &getCollider();

private:
	//Posición X, Y del jugador
	float mPosX;
	int mPosY;

	//Altura y anchura del jugador
	Uint8 mWidth;
	Uint8 mHeight;

	//Velocidad X, Y del jugador
	float mVelX;
	int mVelY;

	//Velocidad base del jugador
	float mBaseSpeed;

	//Contador durante el cual no puede disparar
	int mCooldown;

	//Vidas actuales del jugador
	Uint8 mLives;

	//Vidas iniciales del jugador
	Uint8 mStartingLives;

	//Puntos del jugador
	Uint32 mScore;

	//Multiplicador de puntos
	float mScoreMultiplier;

	//Estado del jugador
	Uint8 mStatus;

	//Indica si el jugador está vivo
	bool mAlive;

	//Sprite para dibujar al jugador en pantalla
	AnimatedSprite *mSprite;

	//Circulo de colisión del jugador
	Circle mCollider;

	//Actualiza el circulo de colisión a la posición del jugador
	void shiftColliders();
};

#endif
