#pragma once
#include "sprite.h"
#include "text.h"

#ifndef MENU_H
#define MENU_H

// Clase menu
class Menu
{
public:
	// Constructor
	Menu();

	// Destructor
	~Menu();

	// Inicializador
	void init(std::string name, int x, int y, int backgroundType, LTexture *texture, SDL_Renderer *renderer, Text *text);

	// Obtiene el nombre del menu
	std::string getName();

	// Obtiene el valor de la variable
	Uint8 getItemSelected();

	// Deja el menu apuntando al primer elemento
	void reset();

	// Deja el menu sin elemento seleccionado
	void deselectItem();

	// Comprueba la entrada (teclado, gamepad) y actua en consecuencia
	bool checkInput(Uint8 input);

	// Actualiza la logica del menu
	void update();

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

	// Establece el color del rectangulo de fondo
	void setBackgroundColor(int r, int g, int b, int alpha);

	// Establece el color del rectangulo del selector
	void setSelectorColor(int r, int g, int b, int alpha);
	
	// Establece el color del texto del selector
	void setSelectorTextColor(int r, int g, int b);

	// Centra el menu respecto a un punto
	void centerMenu(int value);

	// Centra los elementos del menu
	void centerMenuElements();

	// Añade un item al menu
	void addItem(std::string text, const Uint8 hPaddingUp = 0, const Uint8 hPaddingDown = 0);

	// Cambia el texto de un item
	void setItemCaption(Uint8 index, std::string text);

	// Establece el indice del item que se usará por defecto al cancelar el menu
	void setDefaultActionWhenCancel(Uint8 item);

private:
	// Establece el valor de la variable
	void setTotalItems(int num);

	// Establece el rectangulo de fondo del menu
	void setRectSize();

	// Actualiza el menu para recolocarlo correctamente y establecer el tamaño
	void reorganize();

	// Deja el menu apuntando al siguiente elemento
	bool increaseSelectorIndex();

	// Deja el menu apuntando al elemento anterior
	bool decreaseSelectorIndex();

	// Mueve el grafico del selector al elemento seleccionado
	//void moveSelectorSprite(int pos);

	// Actualiza la posicion y el estado del selector
	void updateSelector();

	// Establece el origen del selector
	void setSelectorOrigin(int value);

	// Establece el destino del selector
	void setSelectorTarget(int value);

	// Coloca el selector en una posición específica
	void setSelectorPos(Uint8 index);

	// Obtiene la anchura del elemento más ancho del menu
	Uint16 getWidestItem();

	// Posicion X/Y del texto del primer elemento del menu
	int mPosX; // En esta posición se pinta la primera letra del primer elemento
	int mPosY;

	// Nombre del menu
	std::string mName;

	// Numero de items del menu
	Uint8 mTotalItems;

	// Item del menu que ha sido seleccionado
	Uint8 mItemSelected;

	// Item del menu seleccionado cuando se cancela el menu
	Uint8 mDefaultActionWhenCancel;

	// Espacio de separacion entre items
	Uint8 mVerticalPadding;

	// Tipo de fondo para el menu
	Uint8 mBackgroundType;

	// Sprite con los graficos del selector
	//Sprite mSelectorSprite;

	struct rectangle
	{
		SDL_Rect rect;
		Uint8 r; // Rojo
		Uint8 g; // Verde
		Uint8 b; // Azul
		Uint8 a; // Transparencia
	};

	rectangle mRectBG; // Rectangulo de fondo del menu

	// Estructura para cada elemento del menu
	struct item
	{
		std::string label;
		int x;
		int y;
		Uint8 w;
		Uint8 h;
		Uint8 hPaddingUp;
		Uint8 hPaddingDown;
	};

	item mItem[10];

	// Texto para poder escribir los items del menu
	Text *mText;

	// Puntero al renderizador de la ventana
	SDL_Renderer *mRenderer;

	// Variable para saber si el menu debe estar centrado respecto a un punto
	bool mIsCentered;

	// Centro del menu
	int mCenter;

	// Variable para saber si los elementos van centrados
	bool mAreElementsCentered;

	// Anchura del elemento más ancho
	Uint16 mWidestItem;

	struct selector
	{
		double origin;	// Coordenada de origen
		double target;	// Coordenada de destino
		double y;		// Coordenada actual
		Uint8 numJumps; // Numero de pasos preestablecido para llegar al destino
		double despY;	// (target - origin) / numJumps
		bool moving;	// Indica si el selector está avanzando hacia el destino
		Uint8 index;	// Elemento del menu que tiene el foco
		SDL_Rect rect;
		Uint8 r; // Rojo
		Uint8 g; // Verde
		Uint8 b; // Azul
		Uint8 a; // Transparencia
		Uint8 itemR; // Rojo
		Uint8 itemG; // Verde
		Uint8 itemB; // Azul
	};

	selector mSelector;
};

#endif
