#pragma once
#include <vector>
#include <string>
#include <unordered_set>
#include <unordered_map>
#include "raylib.h"

#ifdef DrawText
#undef DrawText  // windows.h 的 DrawText 宏会破坏方法名
#endif

// ============================================================================
// FontManager - 单例字体管理器
// 管理 Verdana / Tahombd / SmallFont / TabIcons / LegitTabIcons
// + CJK 中文回退字体，自动按需加载码点
// ============================================================================
class FontManager {
public:
    static FontManager& GetInstance();

    // 注册并加载命名字体（TTF 路径或内存字体，DPI 缩放后大小）
    void RegisterFont(const char* name, const char* path, int baseSize);
    void RegisterFontFromMemory(const char* name, const unsigned char* data, int dataSize, int baseSize);

    // 获取已注册字体引用
    RLFont& GetFont(const char* name);

    // 更新已注册字体的基础大小并重建
    void SetFontBaseSize(const char* name, int baseSize);

    // 确保文本中所有码点已加载到对应字体中，必要时重建
    void EnsureText(const char* name, const char* text);

    // 绘制文本（自动确保码点）
    void DrawText(const char* name, const char* text, int x, int y, int fontSize, RLColor color);

    // 测量文本尺寸
    RLVector2 MeasureText(const char* name, const char* text, int fontSize);

    // DPI 缩放：重建所有注册的字体
    float GetDpiScale() const { return m_dpiScale; }
    void SetDpiScale(float scale);

    // 释放所有字体资源
    void UnloadAll();

private:
    FontManager() = default;
    ~FontManager() = default;
    FontManager(const FontManager&) = delete;
    FontManager& operator=(const FontManager&) = delete;

    struct FontEntry {
        RLFont font = { 0 };
        std::string path;
        int baseSize = 12;
        bool fromMemory = false;
        const unsigned char* memData = nullptr;
        int memSize = 0;
        std::unordered_set<int> codepoints;
    };

    std::vector<int>  ExtractCodepoints(const char* text);
    void              RebuildFont(FontEntry& entry);

    std::unordered_map<std::string, FontEntry> m_fonts;
    float m_dpiScale = 1.0f;
};
