#pragma once

#ifdef _DEBUG

#include <SDL3/SDL.h>

#include <string>  // Para string
#include <vector>  // Para vector

// Clase Debug
class Debug {
    public:
        static void init();           // [SINGLETON] Crearemos el objeto con esta función estática
        static void destroy();        // [SINGLETON] Destruiremos el objeto con esta función estática
        static auto get() -> Debug*;  // [SINGLETON] Con este método obtenemos el objeto y podemos trabajar con él

        void render();  // Dibuja en pantalla

        void setPos(SDL_FPoint p);  // Establece la posición donde se colocará la información de debug

        [[nodiscard]] auto isEnabled() const -> bool { return enabled_; }  // Obtiene si el debug está activo

        void add(const std::string& text) { slot_.push_back(text); }      // Añade texto al slot de debug
        void clear() { slot_.clear(); }                                   // Limpia el slot de debug
        void addToLog(const std::string& text) { log_.push_back(text); }  // Añade texto al log
        void clearLog() { log_.clear(); }                                 // Limpia el log
        void setEnabled(bool value) { enabled_ = value; }                 // Establece si el debug está activo
        void toggleEnabled() { enabled_ = !enabled_; }                    // Alterna el estado del debug

    private:
        static Debug* debug;  // [SINGLETON] Objeto privado

        Debug() = default;   // Constructor
        ~Debug() = default;  // Destructor

        // Variables
        std::vector<std::string> slot_;  // Vector con los textos a escribir
        std::vector<std::string> log_;   // Vector con los textos a escribir
        int x_ = 0;                      // Posicion donde escribir el texto de debug
        int y_ = 0;                      // Posición donde escribir el texto de debug
        bool enabled_ = false;           // Indica si esta activo el modo debug
};

#endif  // _DEBUG