#pragma once
#include <memory>
#include <string>
#include <vector>
#include <unordered_map>
#include <optional>

#include "atlas/font_atlas.h"
#include "atlas/font_atlas_manager.h"
#include <filesystem>

#include "font_type.h"
#include "interface/font_interface.h"

/**
 * @class font_manager
 * @brief 字体管理系统
 *
 * 管理多种字体、提供字体回退机制，并处理文本布局和字形图集管理。
 * 实现为单例模式，确保全局只有一个字体管理实例。
 */
class font_manager {
public:
	/**
	 * @brief 获取单例实例
	 *
	 * @return font_manager& 字体管理器的单例引用
	 */
	static font_manager& instance() {
		static font_manager instance;
		return instance;
	}

	/**
	 * @brief 销毁所有资源
	 *
	 * 清理所有字体和图集资源，重置字体管理器状态。
	 */
	void destroy();

	/**
	 * @brief 添加字体
	 *
	 * 从文件加载字体并添加到字体管理系统中。
	 * 如果字体支持彩色表情符号或指定为表情符号字体，将自动添加到表情符号字体列表。
	 *
	 * @param in_font_path 字体文件路径
	 * @param in_font_type 字体类型(regular, bold, italic, emoji等)
	 * @return 添加成功返回字体ID，失败返回-1
	 */
	int add_font(const std::filesystem::path& in_font_path, const std::string& in_font_type = "regular");

	/**
	 * @brief 设置主字体
	 *
	 * @param in_font_id 要设为主字体的字体ID
	 * @return 设置是否成功
	 */
	bool set_primary_font(int in_font_id) {
		if (fonts_.contains(in_font_id)) {
			primary_font_id_ = in_font_id;
			return true;
		}
		return false;
	}

	/**
	 * @brief 获取指定码点的最佳字体
	 *
	 * 实现字体回退机制，按以下顺序尝试查找支持指定码点的字体：
	 * 1. 主字体
	 * 2. 如果是表情符号，尝试表情符号字体
	 * 3. 所有其他字体
	 * 4. 回退到主字体
	 *
	 * @param in_code_point Unicode码点
	 * @return 最适合渲染该码点的字体
	 */
	std::shared_ptr<font_face_interface> get_font_for_code_point(uint32_t in_code_point);

	/**
     * @brief 获取主字体
     * @return 主字体
     */
    std::shared_ptr<font_face_interface> get_primary_font() {
        if (primary_font_id_ != -1 && fonts_.contains(primary_font_id_)) {
            return fonts_[primary_font_id_];
        }
        return nullptr;
    }

    /**
     * @brief 检查是否有彩色表情字体
     * @return 是否支持彩色表情
     */
    [[nodiscard]] bool has_color_emoji_font() const {
        return !emoji_font_ids_.empty();
    }

    /**
     * @brief 布局文本
     *
     * 将Unicode文本转换为可渲染的字形布局，包括位置计算和换行处理。
     *
     * @param text Unicode文本
     * @param in_font 指定字体，如为空则使用主字体
     * @param font_size 字体大小
     * @param max_width 最大宽度，超过此宽度会自动换行，0表示不限制宽度
     * @param line_spacing 行间距系数
     * @return 文本布局结果
     */
    text_layout_t layout_text(
        const std::u32string& text,
        const std::shared_ptr<font_face_interface>& in_font,
        float font_size,
        float max_width = 0.0f,
        float line_spacing = 1.2f);

    /**
     * @brief 获取或创建字形
     *
     * 从图集中获取字形纹理区域，如果不存在则创建。
     *
     * @param in_glyph_id 字形ID
     * @param in_font 字体
     * @param in_font_size 字体大小
     * @param is_emoji 是否为表情符号
     * @return 字形在图集中的区域
     */
    std::optional<atlas_region_t> get_or_create_glyph_by_index(
        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 atlas_manager_.get_glyph_atlases();
	}

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

    std::unordered_map<int, std::shared_ptr<font_face_interface>> fonts_;         ///< 字体ID到字体对象的映射
	font_atlas_manager                                            atlas_manager_; ///< 图集管理器

    std::vector<int> emoji_font_ids_;  ///< 表情符号字体ID列表
    int primary_font_id_ = -1;         ///< 主字体ID
    int next_font_id_ = 0;             ///< 下一个可用的字体ID
};