#pragma once

#include <SDL2/SDL.h>
#include "utils.h"
#include <vector>

#ifndef SCREEN_H
#define SCREEN_H

#define FILTER_NEAREST 0
#define FILTER_LINEAL 1

struct anchor_t
{
	int left;	// Parte izquierda de la pantalla de juego
	int right;	// Parte drecha de la pantalla de juego
	int center; // Parte central horizontal de la pantalla de juego
	int top;	// Parte superior de la pantalla de juego
	int bottom; // Parte infoerior de la pantalla de juego
	int middle; // Parte central vertical de la pantalla de juego
};

// Clase Screen
class Screen
{
private:
	SDL_Window *window;		 // Ventana de la aplicación
	SDL_Renderer *renderer;	 // El renderizador de la ventana
	SDL_Texture *gameCanvas; // Textura para completar la ventana de juego hasta la pantalla completa
	options_t *options;		 // Variable con todas las opciones del programa

	int screenWidth;	  // Ancho de la pantalla o ventana
	int screenHeight;	  // Alto de la pantalla o ventana
	int gameCanvasWidth;  // Resolución interna del juego. Es el ancho de la textura donde se dibuja el juego
	int gameCanvasHeight; // Resolución interna del juego. Es el alto de la textura donde se dibuja el juego
	anchor_t anchor;	  // Variable con los anclajes de la pantalla
	SDL_Rect dest;		  // Coordenadas donde se va a dibujar la textura del juego sobre la pantalla o ventana
	color_t borderColor;  // Color del borde añadido a la textura de juego para rellenar la pantalla

	// EFECTOS
	bool fade;				 // Indica si esta activo el efecto de fade
	int fadeCounter;		 // Temporizador para el efecto de fade
	int fadeLenght;			 // Duración del fade
	bool spectrumFade;		 // Indica si esta activo el efecto de fade spectrum
	int spectrumFadeCounter; // Temporizador para el efecto de fade spectrum
	int spectrumFadeLenght;	 // Duración del fade spectrum
	std::vector<color_t> spectrumColor; // Colores para el fade spectrum

	// Inicializa las variables para el fade
	void iniFade();

	// Actualiza el fade
	void updateFade();

	// Dibuja el fade
	void renderFade();

	// Inicializa las variables para el fade spectrum
	void iniSpectrumFade();

	// Actualiza el spectrum fade
	void updateSpectrumFade();

	// Dibuja el spectrum fade
	void renderSpectrumFade();

public:
	// Constructor
	Screen(SDL_Window *window, SDL_Renderer *renderer, options_t *options, int gameInternalResX, int gameInternalResY);

	// Destructor
	~Screen();

	// Limpia la pantalla
	void clean(color_t color = {0x00, 0x00, 0x00});

	// Prepara para empezar a dibujar en la textura de juego
	void start();

	// Vuelca el contenido del renderizador en pantalla
	void blit();

	// Establece el modo de video
	void setVideoMode(int fullScreenMode);

	// Camibia entre pantalla completa y ventana
	void switchVideoMode();

	// Cambia el tamaño de la ventana
	void setWindowSize(int size);

	// Cambia el color del borde
	void setBorderColor(color_t color);

	// Cambia el tipo de mezcla
	void setBlendMode(SDL_BlendMode blendMode);

	// Establece el tamaño del borde
	void setBorderSize(float s);

	// Establece si se ha de ver el borde en el modo ventana
	void setBorderEnabled(bool value);

	// Cambia entre borde visible y no visible
	void switchBorder();

	// Activa el fade
	void setFade();

	// Comprueba si ha terminado el fade
	bool fadeEnded();

	// Activa el spectrum fade
	void setspectrumFade();

	// Comprueba si ha terminado el spectrum fade
	bool spectrumFadeEnded();

	// Actualiza los efectos
	void updateFX();

	// Dibuja los efectos
	void renderFX();
};

#endif
