#pragma once
#include <vector>
#include <optional>

#include "bitmap_glyph_atlas.h"
#include "color_emoji_atlas.h"

/**
 * @class font_atlas_manager
 * @brief 图集管理器 - 负责管理字形和表情符号的纹理图集
 *
 * 集中处理所有字形和表情符号的图集分配、创建和访问，
 * 使字体管理系统与底层纹理管理解耦。
 */
class font_atlas_manager {
public:
	/**
	 * @brief 默认构造函数
	 */
	font_atlas_manager() = default;

	/**
	 * @brief 获取或创建字形在图集中的区域
	 *
	 * @param in_glyph_id 字形ID
	 * @param in_font 字体引用
	 * @param in_font_size 字体大小
	 * @param is_emoji 是否为表情符号
	 * @return 字形在图集中的区域，失败返回nullopt
	 */
	std::optional<atlas_region_t> get_or_create_glyph(
		int32_t in_glyph_id,
		const std::shared_ptr<font_face_interface>& in_font,
		float in_font_size,
		bool is_emoji);

	/**
	 * @brief 获取所有字形图集
	 * @return 字形图集列表的常量引用
	 */
	[[nodiscard]] const auto& get_glyph_atlases() const {
		return glyph_atlases_;
	}

	/**
	 * @brief 获取所有表情图集
	 * @return 表情图集列表的常量引用
	 */
	[[nodiscard]] const auto& get_emoji_atlases() const {
		return emoji_atlases_;
	}

	/**
	 * @brief 清除所有图集
	 */
	void clear() {
		glyph_atlases_.clear();
		emoji_atlases_.clear();
	}

private:
	std::vector<bitmap_glyph_atlas> glyph_atlases_;  ///< 普通字形图集列表
	std::vector<color_emoji_atlas> emoji_atlases_;   ///< 表情符号图集列表

	/**
	 * @brief 创建新的字形图集
	 * @param atlas_size 图集大小
	 * @return 新创建的图集引用
	 */
	bitmap_glyph_atlas& create_new_glyph_atlas(const Eigen::Vector2i& atlas_size = {1024, 1024});

	/**
	 * @brief 创建新的表情图集
	 * @param atlas_size 图集大小
	 * @return 新创建的图集引用
	 */
	color_emoji_atlas& create_new_emoji_atlas(const Eigen::Vector2i& atlas_size = {1024, 1024});
};
