// vector_text.hpp - Sistema de texto vectorial con display de 7-segmentos
// © 2026 JailDesigner

#pragma once

#include <SDL3/SDL.h>

#include <memory>
#include <string>
#include <unordered_map>

#include "core/graphics/shape.hpp"
#include "core/rendering/render_context.hpp"
#include "core/types.hpp"

namespace Graphics {

    class VectorText {
       public:
        explicit VectorText(Rendering::Renderer* renderer);

        // Renderizar string completo
        // - text: cadena a renderizar (soporta: A-Z, a-z, 0-9, '.', ',', '-', ':',
        // '!', '?', ' ')
        // - position: posición inicial (esquina superior izquierda)
        // - scale: factor de scale (1.0 = 20×40 px por carácter)
        // - spacing: espacio entre caracteres en píxeles (a scale 1.0)
        // - brightness: factor de brightness (0.0-1.0, default 1.0 = màxima brightness)
        // - color: color RGBA explícit; si alpha==0 (default) s'usa l'oscil·lador global
        void render(const std::string& text, const Vec2& position, float scale = 1.0F, float spacing = 2.0F, float brightness = 1.0F, SDL_Color color = {0, 0, 0, 0}) const;

        // Renderizar string centrado en un punto
        // - text: cadena a renderizar
        // - centre_punt: punto central del texto (no esquina superior izquierda)
        // - scale: factor de scale (1.0 = 20×40 px por carácter)
        // - spacing: espacio entre caracteres en píxeles (a scale 1.0)
        // - brightness: factor de brightness (0.0-1.0, default 1.0 = màxima brightness)
        // - color: color RGBA explícit; si alpha==0 (default) s'usa l'oscil·lador global
        void renderCentered(const std::string& text, const Vec2& centre_punt, float scale = 1.0F, float spacing = 2.0F, float brightness = 1.0F, SDL_Color color = {0, 0, 0, 0}) const;

        // Calcular ancho total de un string (útil para centrado).
        // Es estático: no depende del estado del VectorText (el ancho viene de
        // las constantes BASE_CHAR_WIDTH/BASE_CHAR_HEIGHT del archivo .cpp).
        [[nodiscard]] static auto getTextWidth(const std::string& text, float scale = 1.0F, float spacing = 2.0F) -> float;

        // Calcular altura del texto (útil para centrado vertical).
        [[nodiscard]] static auto getTextHeight(float scale = 1.0F) -> float;

        // Verificar si un carácter está soportado
        [[nodiscard]] auto isSupported(char c) const -> bool;

       private:
        Rendering::Renderer* renderer_;
        std::unordered_map<char, std::shared_ptr<Shape>> chars_;

        void loadCharset();
        [[nodiscard]] static auto getShapeFilename(char c) -> std::string;
    };

}  // namespace Graphics
