#pragma once

#include <extra2d/core/color.h>
#include <extra2d/core/math_types.h>
#include <extra2d/core/types.h>
#include <extra2d/graphics/texture/texture.h>
#include <string>
#include <unordered_map>

namespace extra2d {

// ============================================================================
// 字形信息结构
// ============================================================================
struct Glyph {
    float width = 0;        // 字形宽度
    float height = 0;       // 字形高度
    float bearingX = 0;     // 水平偏移
    float bearingY = 0;     // 垂直偏移（从基线到字形顶部）
    float advance = 0;      // 水平步进
    float u0 = 0, v0 = 0;   // 纹理坐标左下角
    float u1 = 0, v1 = 0;   // 纹理坐标右上角
};

// ============================================================================
// 字体图集描述结构
// ============================================================================
struct FontAtlasDesc {
    std::string filepath;   // 字体文件路径
    int fontSize = 16;      // 字体大小
    bool useSDF = false;    // 是否使用SDF渲染
    int atlasSize = 512;    // 图集大小
    int padding = 2;        // 字形间距
};

// ============================================================================
// 字体图集抽象接口 - 渲染后端无关
// ============================================================================
class FontAtlas {
public:
    virtual ~FontAtlas() = default;

    /**
     * @brief 初始化字体图集
     * @param desc 字体图集描述
     * @return 成功返回 true
     */
    virtual bool init(const FontAtlasDesc& desc) = 0;

    /**
     * @brief 关闭字体图集，释放资源
     */
    virtual void shutdown() = 0;

    /**
     * @brief 获取字形信息
     * @param codepoint Unicode 码点
     * @return 字形信息指针，未找到返回 nullptr
     */
    virtual const Glyph* getGlyph(char32_t codepoint) const = 0;

    /**
     * @brief 获取纹理
     * @return 纹理对象
     */
    virtual Ptr<Texture> getTexture() const = 0;

    /**
     * @brief 获取字体大小
     * @return 字体大小
     */
    virtual int getFontSize() const = 0;

    /**
     * @brief 获取行高
     * @return 行高
     */
    virtual float getLineHeight() const = 0;

    /**
     * @brief 获取基线到顶部的距离
     * @return 上升高度
     */
    virtual float getAscent() const = 0;

    /**
     * @brief 获取基线到底部的距离
     * @return 下降高度
     */
    virtual float getDescent() const = 0;

    /**
     * @brief 计算文本宽度
     * @param text 文本内容
     * @return 文本宽度
     */
    virtual float measureText(const std::string& text) const = 0;

    /**
     * @brief 计算文本尺寸
     * @param text 文本内容
     * @return 文本尺寸
     */
    virtual Size measureTextSize(const std::string& text) const = 0;

    /**
     * @brief 是否使用SDF渲染
     * @return 使用SDF返回 true
     */
    virtual bool isSDF() const = 0;

    /**
     * @brief 检查字体图集是否有效
     * @return 有效返回 true
     */
    virtual bool isValid() const = 0;

    /**
     * @brief 预加载字符到图集
     * @param text 需要预加载的文本
     * @return 成功加载的字符数
     */
    virtual int preloadGlyphs(const std::string& text) = 0;

    /**
     * @brief 清空已加载的字形缓存
     */
    virtual void clearCache() = 0;
};

} // namespace extra2d
