#pragma once

#ifdef _DEBUG

#include <SDL3/SDL.h>

#include <functional>  // Para function
#include <memory>      // Para shared_ptr
#include <string>      // Para string

class Surface;

/**
 * @brief Selector visual de tiles de un tileset
 *
 * Muestra el tileset centrado en el play area.
 * Hover ilumina el tile bajo el cursor.
 * Click selecciona el tile y cierra el picker.
 * Mouse wheel para scroll si el tileset es más alto que el play area.
 * ESC o click derecho para cancelar.
 */
class TilePicker {
   public:
    TilePicker() = default;
    ~TilePicker() = default;

    // Abre el picker con un tileset
    // bg_color: color de fondo del panel (-1 = negro)
    // source_color/target_color: sustitución de color (-1 = sin sustitución)
    // tile_spacing_in: pixels de separación entre tiles en el fichero fuente
    // tile_spacing_out: pixels de separación visual entre tiles al mostrar
    void open(const std::string& tileset_name, int current_tile = -1, int bg_color = -1, int source_color = -1, int target_color = -1, int tile_spacing_in = 0, int tile_spacing_out = 1);
    void close();
    [[nodiscard]] auto isOpen() const -> bool { return open_; }

    void render();
    void handleEvent(const SDL_Event& event);

    // Callback al seleccionar un tile (índice del tile)
    std::function<void(int)> on_select;

   private:
    void updateMousePosition();

    bool open_{false};
    std::shared_ptr<Surface> tileset_;        // Surface del tileset original
    std::shared_ptr<Surface> frame_surface_;  // Surface compuesta: borde + tileset
    SDL_FRect frame_dst_{};                   // Posición del frame en pantalla
    int tileset_width_{0};                    // Ancho del tileset en tiles
    int tileset_height_{0};                   // Alto del tileset en tiles
    int current_tile_{-1};                    // Tile actualmente seleccionado (highlight)
    int hover_tile_{-1};                      // Tile bajo el cursor

    // Spacing
    int spacing_in_{0};   // Spacing en el fichero fuente
    int spacing_out_{1};  // Spacing visual al mostrar

    // Scroll y posicionamiento
    int scroll_y_{0};        // Scroll vertical en pixels
    int offset_x_{0};        // Offset X para centrar en pantalla
    int visible_height_{0};  // Altura visible en pixels
};

#endif  // _DEBUG
