#pragma once

#include <SDL3/SDL.h>

#include <vector>  // for vector
class Sprite;
class Text;
class Texture;
struct section_t;

enum mode_e {
    m_manual,
    m_auto
};

// Clase Instructions
class Instructions {
   private:
    // Objetos y punteros
    SDL_Renderer *renderer;               // El renderizador de la ventana
    std::vector<Texture *> itemTextures;  // Vector con las texturas de los items
    SDL_Event *eventHandler;              // Manejador de eventos
    SDL_Texture *backbuffer;              // Textura para usar como backbuffer
    Sprite *sprite;                       // Sprite con la textura de las instrucciones
    Text *text;                           // Objeto para escribir texto
    section_t *section;                   // Estado del bucle principal para saber si continua o se sale

    // Variables
    Uint16 counter;       // Contador
    Uint16 counterEnd;    // Valor final para el contador
    Uint32 ticks;         // Contador de ticks para ajustar la velocidad del programa
    Uint32 ticksSpeed;    // Velocidad a la que se repiten los bucles del programa
    bool manualQuit;      // Indica si se quiere salir del modo manual
    mode_e mode{m_auto};  // Modo en el que se van a ejecutar las instrucciones
    bool finished;        // Indica si las instrucciones han terminado
    bool quitRequested;   // Indica si se ha solicitado salir de la aplicación

    // Comprueba las entradas
    void checkInput();

   public:
    // Constructor
    Instructions(SDL_Renderer *renderer, section_t *section);

    // Destructor
    ~Instructions();

    Instructions(const Instructions &) = delete;
    Instructions &operator=(const Instructions &) = delete;

    // Bucle principal
    void run(mode_e mode);

    // Inicia las instrucciones (sin bucle)
    void start(mode_e mode);

    // Actualiza las variables
    void update();

    // Pinta en pantalla
    void render();

    // Comprueba los eventos
    void checkEvents();

    // Indica si las instrucciones han terminado
    bool hasFinished() const;

    // Indica si se ha solicitado salir de la aplicación
    bool isQuitRequested() const;
};