#pragma once

#include <SDL2/SDL_rect.h>   // Para SDL_Rect
#include <SDL2/SDL_render.h> // Para SDL_Renderer, SDL_Texture

// Modos de funcionamiento para el tileado de fondo
enum class TiledBGMode : int
{
    CIRCLE = 0,
    DIAGONAL = 1,
    RANDOM = 2,
    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:
    // Constantes
    static constexpr int TILE_WIDTH_ = 64;  // Ancho del tile
    static constexpr int TILE_HEIGHT_ = 64; // Alto del tile

    // Objetos y punteros
    SDL_Renderer *renderer_; // El renderizador de la ventana
    SDL_Texture *canvas_;    // Textura donde dibujar el fondo formado por tiles

    // Variables
    SDL_Rect pos_;     // Posición y tamaño del mosaico
    SDL_Rect window_;  // Ventana visible para la textura de fondo del titulo
    int counter_ = 0;  // Contador
    TiledBGMode mode_; // Tipo de movimiento del mosaico
    double sin_[360];  // Vector con los valores del seno precalculados

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

public:
    // Constructor
    TiledBG(SDL_Rect pos, TiledBGMode mode);

    // Destructor
    ~TiledBG();

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

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

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