#pragma once

#include <map>
#include <string>
#include <utility>

#include <QByteArray>
#include <QPixmap>
#include <QString>

// Rasterizes and caches per-item icon SVGs (REQ-UI-ITEM-ICON). Item icons are
// self-contained, full-color SVGs loaded from a directory, one file per item type
// named after the item's id (e.g. "iron_ore.svg"). Shared by the recipe-selection
// dialog (REQ-UI-RECIPE-ICON) and the game world's belt/port item rendering so the
// rasterization is not duplicated.
//
// A missing icon file is not an error: hasIcon() returns false for it and the caller
// falls back (a colored square in the world, a name caption in the dialog).
class ItemIconCache
{
public:
    // iconDir is the directory holding the "<item_id>.svg" icon files
    // (typically "<configDir>/../icons/items").
    explicit ItemIconCache(const QString& iconDir);

    // True if an icon SVG file exists for the given item id. Loads the file's bytes
    // on first query and remembers the result (including absence) so repeated calls
    // are cheap.
    bool hasIcon(const std::string& itemId);

    // Returns the item's icon rasterized to a transparent sizePx*sizePx pixmap,
    // cached per (item id, size) so it is rendered once and reused across frames and
    // only re-rasterized when the target size changes (REQ-UI-ITEM-ICON). Returns a
    // null pixmap if the item has no icon file (callers should gate on hasIcon()).
    QPixmap getPixmap(const std::string& itemId, int sizePx);

private:
    // Returns the raw SVG bytes for an item id, loading and caching them on first
    // access. An absent file caches an empty QByteArray so it is not retried.
    const QByteArray& getSvg(const std::string& itemId);

    QString                            m_iconDir;
    std::map<std::string, QByteArray>  m_svgById;
    std::map<std::pair<std::string, int>, QPixmap> m_pixmapCache;
};
