#pragma once

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

#ifndef SCREEN_H
#define SCREEN_H

#define FILTER_NEAREST 0
#define FILTER_LINEAL 1

class Screen
{
private:
	// Objetos y punteros
	SDL_Window *window;		 // Ventana de la aplicación
	SDL_Renderer *renderer;	 // El renderizador de la ventana
	Asset *asset;			 // Objeto con el listado de recursos
	SDL_Texture *gameCanvas; // Textura para completar la ventana de juego hasta la pantalla completa
	options_t *options;		 // Variable con todas las opciones del programa
	Notify *notify;			 // Dibuja notificaciones por pantalla

	// Variables
	int windowWidth;			   // Ancho de la pantalla o ventana
	int windowHeight;			   // 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
	int borderWidth;			   // Anchura del borde
	int borderHeight;			   // Anltura del borde
	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
	bool notifyActive;			   // Indica si hay notificaciones activas
	int notificationLogicalWidth;  // Ancho lógico de las notificaciones en relación al tamaño de pantalla
	int notificationLogicalHeight; // Alto lógico de las notificaciones en relación al tamaño de pantalla

	// Variables - 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();

	// Dibuja las notificaciones
	void renderNotifications();

	// Establece el tamaño de las notificaciones
	void setNotificationSize();

public:
	// Constructor
	Screen(SDL_Window *window, SDL_Renderer *renderer, Asset *asset, options_t *options);

	// 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 videoMode);

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

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

	// Reduce el tamaño de la ventana
	void decWindowSize();

	// Aumenta el tamaño de la ventana
	void incWindowSize();

	// 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 setBorderWidth(int s);
	void setBorderHeight(int 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();

	// Actualiza el notificador
	void updateNotifier();

	// Muestra una notificación de texto por pantalla;
	void showNotification(std::string text1 = "", std::string text2 = "", int icon = -1);
};

#endif
