#ifdef _DEBUG

#include "game/editor/editor_statusbar.hpp"

#include <string>  // Para to_string
#include <utility>

#include "core/rendering/screen.hpp"          // Para Screen
#include "core/rendering/surface.hpp"         // Para Surface
#include "core/rendering/text.hpp"            // Para Text
#include "core/resources/resource_cache.hpp"  // Para Resource::Cache
#include "game/options.hpp"                   // Para Options::game
#include "utils/utils.hpp"                    // Para toLower

// Constructor
EditorStatusBar::EditorStatusBar(std::string room_number)
    : surface_(std::make_shared<Surface>(Options::game.width, SURFACE_HEIGHT)),
      surface_dest_{.x = 0, .y = Options::game.height - SURFACE_HEIGHT, .w = Options::game.width, .h = SURFACE_HEIGHT},
      room_number_(std::move(room_number)) {}

// Pinta la barra de estado en pantalla
void EditorStatusBar::render() {
    surface_->render(nullptr, &surface_dest_);
}

// Actualiza la barra de estado
void EditorStatusBar::update([[maybe_unused]] float delta_time) {
    fillTexture();
}

void EditorStatusBar::setMouseTile(int tile_x, int tile_y) {
    mouse_tile_x_ = tile_x;
    mouse_tile_y_ = tile_y;
}

void EditorStatusBar::setLine2(const std::string& text) { line2_ = text; }
void EditorStatusBar::setLine3(const std::string& text) { line3_ = text; }
void EditorStatusBar::setLine4(const std::string& text) { line4_ = text; }
void EditorStatusBar::setLine5(const std::string& text) { line5_ = text; }

// Dibuja los elementos en la surface
void EditorStatusBar::fillTexture() {
    auto previous_renderer = Screen::get()->getRendererSurface();
    Screen::get()->setRendererSurface(surface_);

    surface_->clear(0);

    auto text = Resource::Cache::get()->getText("8bithud");
    const Uint8 LABEL_COLOR = 11;
    const Uint8 VALUE_COLOR = 14;
    const Uint8 DETAIL_COLOR = 13;
    const Uint8 COORD_COLOR = 9;
    const int RIGHT_X = static_cast<int>(Options::game.width) - LEFT_X;

    // Línea 1: Room number (izq) + line4 extra (centro) + tile coords + line5 drag info (der)
    text->writeColored(LEFT_X, LINE1_Y, toLower(room_number_), LABEL_COLOR);

    // Tile coords + drag info a la derecha
    const std::string TILE_X_STR = (mouse_tile_x_ < 10 ? "0" : "") + std::to_string(mouse_tile_x_);
    const std::string TILE_Y_STR = (mouse_tile_y_ < 10 ? "0" : "") + std::to_string(mouse_tile_y_);
    std::string right_part = TILE_X_STR + "," + TILE_Y_STR;
    if (!line5_.empty()) { right_part += " " + line5_; }
    if (!line4_.empty()) { right_part = toLower(line4_) + " " + right_part; }
    text->writeColored(RIGHT_X - text->length(right_part), LINE1_Y, right_part, COORD_COLOR);

    // Línea 2: Propiedades de room o info de enemigo
    if (!line2_.empty()) {
        text->writeColored(LEFT_X, LINE2_Y, toLower(line2_), DETAIL_COLOR);
    }

    // Línea 3: Conexiones+items o propiedades del enemigo
    if (!line3_.empty()) {
        text->writeColored(LEFT_X, LINE3_Y, toLower(line3_), VALUE_COLOR);
    }

    Screen::get()->setRendererSurface(previous_renderer);
}

#endif  // _DEBUG
