#pragma once
#include <vector>

#include "geometry/rect.h"
#include "misc/mirage_type.h"
#include "texture/atlas/texture_atlas_types.h"

class texture2d;

/**
 * @enum horizontal_text_alignment_t
 * @brief 文本水平对齐方式
 */
enum class horizontal_text_alignment_t {
	left,	///< 文本左对齐
	center, ///< 文本居中对齐
	right	///< 文本右对齐
};

/**
 * @enum vertical_text_alignment_t
 * @brief 文本垂直对齐方式
 */
enum class vertical_text_alignment_t {
	top,    ///< 文本顶部对齐
	center, ///< 文本居中对齐
	bottom  ///< 文本底部对齐
};

/**
 * @struct positioned_glyph_t
 * @brief 已定位的字形
 */
struct positioned_glyph_t {
	uint32_t                   code_point = 0;    ///< Unicode码点
	Eigen::Vector2f            position;         ///< 屏幕位置
	rect_t<>                   bounds;           ///< 边界矩形
	float                      advance  = 0.0f;  ///< 前进量
	bool                       is_emoji = false; ///< 是否为表情符号
	std::shared_ptr<texture2d> texture;          ///< 字形纹理
	atlas_region_t             atlas_region;     ///< 图集区域
	std::vector<uint32_t>      emoji_sequence;   ///< 表情序列(对表情符号)

	/**
	 * @brief 设置为MTSDF字形
	 * @param in_region 图集区域
	 * @param in_mtsdf_texture MTSDF纹理
	 */
	void set_mtsdf_glyph(const atlas_region_t& in_region, const std::shared_ptr<texture2d>& in_mtsdf_texture) {
		atlas_region = in_region;
		texture      = in_mtsdf_texture;
		is_emoji     = false;
	}

	/**
	 * @brief 设置为表情字形
	 * @param in_region 图集区域
	 * @param in_emoji_texture 表情纹理
	 * @param in_sequence 表情序列
	 */
	void set_emoji_glyph(const atlas_region_t&        in_region, const std::shared_ptr<texture2d>& in_emoji_texture,
	                     const std::vector<uint32_t>& in_sequence) {
		atlas_region   = in_region;
		texture        = in_emoji_texture;
		is_emoji       = true;
		emoji_sequence = in_sequence;
	}
};

/**
 * @struct text_line_t
 * @brief 文本行结构
 */
struct text_line_t {
	std::vector<positioned_glyph_t> glyphs;            ///< 字形数组
	float                           y_position = 0.0f; ///< 行基线Y坐标
	float                           ascent     = 0.0f; ///< 行上升高度
	float                           descent    = 0.0f; ///< 行下降高度
	float                           width      = 0.0f; ///< 行宽度
	float                           height     = 0.0f; ///< 行高度

	/**
	 * @brief 获取行边界框
	 * @return 行边界矩形
	 */
	rect_t<> get_bounds() const { return rect_t<>({ 0, y_position - ascent }, { width, ascent + descent }); }
};

/**
 * @struct text_paragraph_t
 * @brief 段落结构
 */
struct text_paragraph_t {
    std::vector<text_line_t> lines;        ///< 段落中的行
    flow_direction_t flow_direction;        ///< 文本方向
    rect_t<> bounds;                       ///< 段落边界
};

/**
 * @struct text_style_t
 * @brief 文本样式
 */
struct text_style_t {
	linear_color                text_color        = { 1, 1, 1, 1 };                    ///< 文本颜色
	float                       font_size         = 16.0f;                             ///< 字体大小
	float                       emoji_size        = 24.0f;                             ///< 表情大小
	float                       smoothing         = 0.1f;                              ///< MTSDF平滑值
	float                       character_spacing = 0.0f;                              ///< 字符间距
	float                       line_spacing      = 0.0f;                              ///< 行间距
	float                       paragraph_spacing = 8.0f;                              ///< 段落间距
	horizontal_text_alignment_t h_align           = horizontal_text_alignment_t::left; ///< 水平对齐
	vertical_text_alignment_t   v_align           = vertical_text_alignment_t::top;    ///< 垂直对齐
	flow_direction_t            text_direction    = flow_direction_t::left_to_right;   ///< 文本方向
	bool                        word_wrap         = true;                              ///< 自动换行
	margin_t                    text_margin       = { 0, 0, 0, 0 };                    ///< 文本边距
};

struct text_layout_t {
	struct glyph_position_t {
		bool            is_emoji;    // 是否为表情符号
		int32_t         glyph_index; // 字符码点
		Eigen::Vector2f position;    // 屏幕位置
		Eigen::Vector2f size;        // 字形尺寸
		atlas_region_t  region;      // 纹理图集区域
	};

	std::vector<glyph_position_t> glyphs;     // 所有字形位置
	Eigen::Vector2f               total_size; // 文本总尺寸
	float                         ascent;     // 上升高度
	float                         baseline;   // 基线位置
};
