#pragma once

#include <SDL3/SDL.h>
#include <SDL3_ttf/SDL_ttf.h>

#include <string>

class TextRenderer {
    public:
        TextRenderer();
        ~TextRenderer();

        // Inicializa el renderizador de texto con una fuente
        bool init(SDL_Renderer* renderer, const char* font_path, int font_size, bool use_antialiasing = true);

        // Reinicializa el renderizador con un nuevo tamaño de fuente
        bool reinitialize(int new_font_size);

        // Libera recursos
        void cleanup();

        // Renderiza texto en la posición especificada con color RGB
        void print(int x, int y, const char* text, uint8_t r, uint8_t g, uint8_t b);
        void print(int x, int y, const std::string& text, uint8_t r, uint8_t g, uint8_t b);

        // Renderiza texto en coordenadas lógicas, pero convierte a físicas para tamaño absoluto
        void printPhysical(int logical_x, int logical_y, const char* text, uint8_t r, uint8_t g, uint8_t b, float scale_x, float scale_y);
        void printPhysical(int logical_x, int logical_y, const std::string& text, uint8_t r, uint8_t g, uint8_t b, float scale_x, float scale_y);

        // Renderiza texto en coordenadas físicas absolutas (tamaño fijo independiente de resolución)
        // NOTA: Este método usa el tamaño de fuente tal cual fue cargado, sin escalado
        void printAbsolute(int physical_x, int physical_y, const char* text, SDL_Color color);
        void printAbsolute(int physical_x, int physical_y, const std::string& text, SDL_Color color);

        // Renderiza texto con sombra negra (+1px offset) para máxima legibilidad sobre cualquier fondo
        void printAbsoluteShadowed(int physical_x, int physical_y, const char* text);
        void printAbsoluteShadowed(int physical_x, int physical_y, const std::string& text);

        // Obtiene el ancho de un texto renderizado (en píxeles lógicos para compatibilidad)
        int getTextWidth(const char* text);

        // Obtiene el ancho de un texto en píxeles FÍSICOS reales (sin escalado)
        // Útil para notificaciones y elementos UI de tamaño fijo
        int getTextWidthPhysical(const char* text);

        // Obtiene la altura de la fuente (incluye line_gap)
        int getTextHeight();

        // Obtiene la altura real del glifo (ascender + |descendente|, sin line_gap)
        int getGlyphHeight();

        // Verifica si está inicializado correctamente
        bool isInitialized() const { return font_ != nullptr && renderer_ != nullptr; }

    private:
        SDL_Renderer* renderer_;
        TTF_Font* font_;
        int font_size_;
        bool use_antialiasing_;
        std::string font_path_;            // Almacenar ruta para reinitialize()
        unsigned char* font_data_buffer_;  // Buffer de datos de fuente (mantener en memoria mientras esté abierta)
};
