#pragma once

#include <SDL2/SDL.h>
#include "ltexture.h"
#include <string>

#ifndef UTILS_H
#define UTILS_H

#define FILTER_NEAREST 0
#define FILTER_LINEAL 1

// Secciones del programa
#define SECTION_PROG_LOGO 0
#define SECTION_PROG_INTRO 1
#define SECTION_PROG_TITLE 2
#define SECTION_PROG_GAME 3
#define SECTION_PROG_QUIT 4

// Subsecciones
#define SUBSECTION_GAME_PLAY 0
#define SUBSECTION_GAME_PAUSE 1
#define SUBSECTION_GAME_GAMEOVER 2
#define SUBSECTION_TITLE_1 3
#define SUBSECTION_TITLE_2 4
#define SUBSECTION_TITLE_3 5
#define SUBSECTION_TITLE_INSTRUCTIONS 6

// Estructura para definir un circulo
struct circle_t
{
	int x;
	int y;
	int r;
};

// Estructura para definir un color
struct color_t
{
	Uint8 r;
	Uint8 g;
	Uint8 b;
};

// Estructura para saber la seccion y subseccion del programa
struct section_t
{
	Uint8 name;
	Uint8 subsection;
};

// Estructura con todas las opciones de configuración del programa
struct options_t
{
	Uint32 fullScreenMode; // Contiene el valor del modo de pantalla completa
	int windowSize;		   // Contiene el valor por el que se multiplica el tamaño de la ventana
	Uint32 filter;		   // Filtro usado para el escalado de la imagen
	bool vSync;			   // Indica si se quiere usar vsync o no
	int screenWidth;	   // Ancho de la pantalla o ventana
	int screenHeight;	   // Alto de la pantalla o ventana
	bool integerScale;	   // Indica si el escalado de la imagen ha de ser entero en el modo a pantalla completa
	bool keepAspect;	   // Indica si se ha de mantener la relación de aspecto al poner el modo a pantalla completa
};

// Calcula el cuadrado de la distancia entre dos puntos
double distanceSquared(int x1, int y1, int x2, int y2);

// Detector de colisiones entre dos circulos
bool checkCollision(circle_t &a, circle_t &b);

// Detector de colisiones entre un circulo y un rectangulo
bool checkCollision(circle_t &a, SDL_Rect &b);

// Detector de colisiones entre un dos rectangulos
bool checkCollision(SDL_Rect &a, SDL_Rect &b);

// Detector de colisiones entre un punto y u rectangulo
bool checkCollision(SDL_Point &p, SDL_Rect &r);

// Devuelve un color_t a partir de un string
color_t stringToColor(std::string str);

#endif