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

class Font {
public:
    static Font* Get();

    // 初始化加载字体（搜索 font/ 目录 → 系统字体）
    void LoadCustom();

    // 确保文本中的字符已加载，必要时重建字体
    void Ensure(const char* text);

    // 绘制文本
    void DrawTextEX(const char* text, RLVector2 pos, int fontSize, RLColor color, int spacing = 0);

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

    // 获取 raylib 字体引用
    const RLFont& GetFont() const { return m_font; }

    // 释放字体资源
    void Clear();

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

    std::vector<int> ExtractCodepoints(const char* text);
    void Rebuild();

    RLFont m_font = { 0 };
    std::string m_fontPath;
    int m_fontSizeGlobal = 32;
    std::unordered_set<int> m_codepointSet;
    std::vector<int> m_codepoints;
    bool m_usingDefaultFont = false;
};