#pragma once

#include <SDL3/SDL.h>

#include <memory>  // Para shared_ptr
#include <string>  // Para string
#include <utility>

class Surface;

class Scoreboard {
   public:
    // Tipos anidados
    struct Data {
        int items{0};         // Lleva la cuenta de los objetos recogidos
        int lives{0};         // Lleva la cuenta de las vidas restantes del jugador
        int rooms{0};         // Lleva la cuenta de las habitaciones visitadas
        bool music{true};     // Indica si ha de sonar la música durante el juego
        Uint8 color{0};       // Color para escribir el texto del marcador
        Uint32 ini_clock{0};  // Tiempo inicial para calcular el tiempo transcurrido
    };

    // Métodos públicos
    explicit Scoreboard(std::shared_ptr<Data> data);  // Constructor
    ~Scoreboard() = default;                          // Destructor
    void render();                                    // Pinta el objeto en pantalla
    void update(float delta_time);                    // Actualiza las variables del objeto
    void setPaused(bool value);                       // Pone el marcador en modo pausa
    auto getMinutes() -> int;                         // Devuelve la cantidad de minutos de juego transcurridos

   private:
    // Tipos anidados
    struct ClockData {
        int hours{0};
        int minutes{0};
        int seconds{0};
        std::string separator{":"};
    };

    // Constantes de tiempo
    // Posición de los elementos (2 líneas centradas verticalmente en surface de 24px)
    static constexpr float SURFACE_HEIGHT = 24.0F;  // 3 líneas de 8px
    static constexpr int LINE1_Y = 5;
    static constexpr int LINE2_Y = 13;

    // Colores
    static constexpr Uint8 LABEL_COLOR = 11;
    static constexpr Uint8 VALUE_COLOR = 9;

    // Métodos privados
    auto getTime() -> ClockData;
    void fillTexture();

    // Objetos y punteros
    std::shared_ptr<Data> data_;
    std::shared_ptr<Surface> surface_;

    // Variables de estado
    bool is_paused_{false};
    Uint32 paused_time_{0};
    Uint32 paused_time_elapsed_{0};
    ClockData clock_{};
    SDL_FRect surface_dest_{};
};
