#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 *textureLegs, LTexture *textureBody, SDL_Renderer *renderer);

	// Actua en consecuencia de la entrada recibida
	void setInput(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 setWalkingStatus(Uint8 status);
	void setFiringStatus(Uint8 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 valor de la variable
	bool isInvulnerable();

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

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

	// Establece el valor de la variable
	void setInvulnerableTimer(Uint16 value);

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

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

	// Concede un toque extra al jugador
	void giveExtraHit();

	// Quita el toque extra al jugador
	void removeExtraHit();

	// 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 mStatusWalking;
	Uint8 mStatusFiring;

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

	// Indica si el jugador es invulnerable
	bool mInvulnerable;

	// Temporizador para la invulnerabilidad
	Uint16 mInvulnerableTimer;

	// Indica si el jugador tiene un toque extra
	bool mExtraHit;

	// Sprite para dibujar al jugador en pantalla
	AnimatedSprite *mSpriteLegs;
	AnimatedSprite *mSpriteBody;

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

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

#endif
