// debug_overlay.cpp - Implementación del overlay de debug.

#include "core/system/debug_overlay.hpp"

#include <string>

#include "core/types.hpp"
#include "game/options.hpp"

namespace System {

namespace {
// Posición y tamaño del overlay en coordenadas lógicas (1280×720).
constexpr float OVERLAY_X = 12.0F;
constexpr float OVERLAY_Y_FPS = 12.0F;
constexpr float OVERLAY_LINE_HEIGHT = 18.0F;  // separación entre líneas (scale 0.4 → ~16 px alto)
constexpr float OVERLAY_SCALE = 0.4F;
constexpr float OVERLAY_SPACING = 2.0F;
constexpr float OVERLAY_BRIGHTNESS = 1.0F;

// Cadencia de actualización del valor de FPS mostrado.
constexpr float FPS_UPDATE_INTERVAL = 0.5F;
}  // namespace

DebugOverlay::DebugOverlay(Rendering::Renderer* renderer)
    : text_(renderer),
#ifdef _DEBUG
      visible_(true),
#else
      visible_(false),
#endif
      fps_accumulator_(0.0F),
      fps_frame_count_(0),
      fps_display_(0) {}

void DebugOverlay::update(float delta_time) {
    fps_accumulator_ += delta_time;
    fps_frame_count_++;

    if (fps_accumulator_ >= FPS_UPDATE_INTERVAL) {
        fps_display_ = static_cast<int>(fps_frame_count_ / fps_accumulator_);
        fps_frame_count_ = 0;
        fps_accumulator_ = 0.0F;
    }
}

void DebugOverlay::draw() const {
    if (!visible_) {
        return;
    }

    const std::string FPS_TEXT = "FPS: " + std::to_string(fps_display_);
    const std::string VSYNC_TEXT = std::string("VSYNC: ")
        + (Options::rendering.vsync == 1 ? "ON" : "OFF");

    text_.render(FPS_TEXT,
                 Vec2{.x = OVERLAY_X, .y = OVERLAY_Y_FPS},
                 OVERLAY_SCALE, OVERLAY_SPACING, OVERLAY_BRIGHTNESS);
    text_.render(VSYNC_TEXT,
                 Vec2{.x = OVERLAY_X, .y = OVERLAY_Y_FPS + OVERLAY_LINE_HEIGHT},
                 OVERLAY_SCALE, OVERLAY_SPACING, OVERLAY_BRIGHTNESS);
}

}  // namespace System
