// vector_text.hpp - Sistema de texto vectorial con display de 7-segmentos
// © 2025 Port a C++20 con SDL3

#pragma once

#include "core/rendering/render_context.hpp"

#include <SDL3/SDL.h>

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

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

namespace Graphics {

class VectorText {
    public:
        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)
        void render(const std::string& text, const Vec2& position, float scale = 1.0F, float spacing = 2.0F, float brightness = 1.0F) 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)
        void renderCentered(const std::string& text, const Vec2& centre_punt, float scale = 1.0F, float spacing = 2.0F, float brightness = 1.0F) const;

        // Calcular ancho total de un string (útil para centrado)
        [[nodiscard]] float get_text_width(const std::string& text, float scale = 1.0F, float spacing = 2.0F) const;

        // Calcular altura del texto (útil para centrado vertical)
        [[nodiscard]] float get_text_height(float scale = 1.0F) const;

        // Verificar si un carácter está soportado
        [[nodiscard]] bool is_supported(char c) const;

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

        void load_charset();
        [[nodiscard]] std::string get_shape_filename(char c) const;
};

}  // namespace Graphics
