#pragma once

#include <SDL2/SDL_rect.h>	 // for SDL_Rect
#include <SDL2/SDL_render.h> // for SDL_Renderer
#include <string>			 // for basic_string, string
#include <vector>			 // for vector
#include <memory>
#include "utils.h" // for Color
#include "text.h"
#include "texture.h"
#include "sprite.h"
struct JA_Sound_t;

class Notify
{
private:
	enum class NotificationStatus
	{
		RISING,
		STAY,
		VANISHING,
		FINISHED,
	};

	enum class NotificationPosition
	{
		UPPER_LEFT,
		UPPER_CENTER,
		UPPER_RIGHT,
		MIDDLE_LEFT,
		MIDDLE_RIGHT,
		BOTTOM_LEFT,
		BOTTOM_CENTER,
		BOTTOM_RIGHT,
	};

	enum class NotificationShape
	{
		ROUNDED,
		SQUARED,
	};

	struct Notification
	{
		std::shared_ptr<Texture> texture;
		std::shared_ptr<Sprite> sprite;
		std::string text1;
		std::string text2;
		int counter;
		NotificationStatus status;
		NotificationPosition position;
		NotificationShape shape;
		SDL_Rect rect;
		int y;
		int travelDist;
	};

	// Objetos y punteros
	SDL_Renderer *renderer; // El renderizador de la ventana

	std::shared_ptr<Texture> iconTexture; // Textura para los iconos de las notificaciones
	std::unique_ptr<Text> text;			  // Objeto para dibujar texto

	// Variables
	Color bgColor;							 // Color de fondo de las notificaciones
	int waitTime;							 // Tiempo que se ve la notificación
	std::vector<Notification> notifications; // La lista de notificaciones activas
	JA_Sound_t *sound;						 // Sonido a reproducir cuando suena la notificación
	bool stack;								 // Indica si las notificaciones se apilan
	bool hasIcons;							 // Indica si el notificador tiene textura para iconos

	// Elimina las notificaciones finalizadas
	void clearFinishedNotifications();

	// Finaliza y elimnina todas las notificaciones activas
	void clearNotifications();

public:
	// Constructor
	Notify(SDL_Renderer *renderer, std::string iconFile, std::string bitmapFile, std::string textFile, std::string soundFile);

	// Destructor
	~Notify();

	// Dibuja las notificaciones por pantalla
	void render();

	// Actualiza el estado de las notificaiones
	void update();

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

	// Indica si hay notificaciones activas
	bool active();
};
