#pragma once

#include <SDL2/SDL_rect.h>    // for SDL_Rect
#include <SDL2/SDL_render.h>  // for SDL_Renderer, SDL_Texture
#include <string>             // for string, basic_string

// Modos de funcionamiento para el tileado de fondo
#define TILED_MODE_CIRCLE 0
#define TILED_MODE_DIAGONAL 1
#define TILED_MODE_RANDOM 2
#define TILED_MODE_STATIC 3

/*
    Esta clase dibuja un tileado de fondo. Para ello se sirve de una textura "canvas", que rellena con los tiles.
    El rectangulo "window" recorre la textura de diferentes formas para generar el efecto de movimiento de la
    textura en pantalla
*/

// Clase Tiledbg
class Tiledbg
{
private:
    // Objetos y punteros
    SDL_Renderer *renderer; // El renderizador de la ventana
    SDL_Rect window;        // Ventana visible para la textura de fondo del titulo
    SDL_Texture *canvas;    // Textura donde dibujar el fondo formado por tiles

    // Variables
    std::string texturePath; // Fichero para usar en la textura
    SDL_Rect pos;            // Posición y tamaña del mosaico
    int counter;             // Contador
    int mode;                // Tipo de movimiento del mosaico
    float sin[360];          // Vector con los valores del seno precalculados
    int tileWidth;           // Ancho del tile
    int tileHeight;          // Alto del tile

    // Inicializa las variables
    void init();

    // Rellena la textura con el contenido
    void fillTexture();

public:
    // Constructor
    Tiledbg(std::string texturePath, SDL_Rect pos, int mode);

    // Destructor
    ~Tiledbg();

    // Pinta la clase en pantalla
    void render();

    // Actualiza la lógica de la clase
    void update();

    // Recarga las texturas
    void reLoad();
};