#include "font_atlas_manager.h"

/**
 * @brief 在指定的图集列表中查找或创建字形的核心逻辑。
 *
 * @tparam AtlasType 图集对象的类型 (例如 glyph_atlas_t)。
 * @param key 要查找或创建的字形的键。
 * @param atlases 要搜索和/或添加到的图集列表 (通过引用传递)。
 * @param current_atlas_index 当前活动图集的索引 (通过引用传递，可能会被更新)。
 * @param create_new_atlas_func 一个函数对象，用于在需要时创建新的图集。
 * @return 如果成功找到或创建了字形，则返回包含图集区域的 std::optional；否则返回 std::nullopt。
 */
template <typename AtlasType>
std::optional<atlas_region_t> find_or_create_in_atlases(
    const char_key_t& key,
    std::vector<AtlasType>& atlases,
    size_t& current_atlas_index,
    const std::function<void(const Eigen::Vector2i&)>& create_new_atlas_func)
{
	glyph_atlas_result_t result{};
	result.reason = glyph_atlas_reason_t::unknown; // 默认为失败

	// **1. 尝试在现有图集中查找**
	for (auto& atlas: atlases) {
		glyph_atlas_result_t find_result = atlas.find_in_cache(key);
		if (find_result.reason == glyph_atlas_reason_t::success) {
			return find_result.region; // 找到了!
		}
	}

	// **2. 尝试在当前图集中创建**
	if (!atlases.empty() && current_atlas_index < atlases.size()) {
		result = atlases[current_atlas_index].create_glyph(key);
		if (result.reason == glyph_atlas_reason_t::success) {
			return result.region; // 在当前图集中创建成功!
		}
	}
	else {
		// 如果没有图集或当前索引无效，则模拟图集已满以触发创建流程
		result.reason = glyph_atlas_reason_t::atlas_full;
	}

	// **3. 如果当前图集已满 (或不存在), 创建一个新图集并尝试创建**
	if (result.reason == glyph_atlas_reason_t::atlas_full) {
		const Eigen::Vector2i new_atlas_size = { 2048, 2048 }; // 示例大小

		// 调用传入的函数来创建特定类型的新图集
		create_new_atlas_func(new_atlas_size);

		// 检查新图集是否真的被创建了
		if (atlases.empty()) {
			// 错误处理：图集创建失败？
			// 可以添加日志记录
			return std::nullopt; // 无法继续
		}

		// 更新当前图集索引为新创建的图集 (最后一个)
		current_atlas_index = atlases.size() - 1;

		// 尝试在新图集中创建字形 (直接访问最后一个元素)
		result = atlases.back().create_glyph(key);

		if (result.reason == glyph_atlas_reason_t::success) {
			return result.region; // 在新图集中创建成功!
		}
	}

	// **4. 如果所有尝试都失败，返回 nullopt**
	return std::nullopt;
}

std::optional<atlas_region_t> font_atlas_manager::get_or_create_glyph(
		const int32_t                               in_glyph_id,
		const std::shared_ptr<font_face_interface>& in_font,
		const float                                 in_font_size,
		const bool                                  is_emoji) {
	const char_key_t key(in_glyph_id, in_font, in_font_size);

	if (is_emoji) {
		// **处理表情符号**
		// 使用 lambda 传递特定的新图集创建函数
		auto create_new_atlas_lambda = [this](const Eigen::Vector2i& size) {
			this->create_new_emoji_atlas(size);
		};
		return find_or_create_in_atlases(
			key,
			emoji_atlases_,         // 表情图集列表
			current_emoji_atlas_,   // 当前表情图集索引
			create_new_atlas_lambda // 创建新表情图集的函数
		);
	}

	// **处理普通字形**
	// 使用 lambda 传递特定的新图集创建函数
	auto create_new_atlas_lambda = [this](const Eigen::Vector2i& size) {
		this->create_new_glyph_atlas(size);
	};
	return find_or_create_in_atlases(
			key,
			glyph_atlases_,         // 普通字形图集列表
			current_glyph_atlas_,   // 当前普通字形图集索引
			create_new_atlas_lambda // 创建新普通字形图集的函数
			);
}

bitmap_glyph_atlas& font_atlas_manager::create_new_glyph_atlas(const Eigen::Vector2i& atlas_size) {
    auto& atlas = glyph_atlases_.emplace_back();
    atlas.initialize(atlas_size);
    return atlas;
}

color_emoji_atlas& font_atlas_manager::create_new_emoji_atlas(const Eigen::Vector2i& atlas_size) {
    auto& atlas = emoji_atlases_.emplace_back();
    atlas.initialize(atlas_size);
    return atlas;
}
