//
// Created by 46944 on 25-3-20.
//
#include "layout_utils.h"

void arrange_single_child(const geometry_t& in_allotted_geometry, const std::shared_ptr<mwidget>& child_widget,
                          horizontal_alignment_t h_alignment, vertical_alignment_t v_alignment, const margin_t& margin) {
	if (!child_widget) return;

	const auto& local_size = in_allotted_geometry.get_local_size();

	child_widget->cache_desired_size(child_widget->get_dpi_scale());
	const auto& child_desired_size_opt = child_widget->get_desired_size();
	const auto& child_desired_size     = child_desired_size_opt.value();

	// 计算考虑边距后的有效可用空间
	Eigen::Vector2f available_size{
		local_size.x() - margin.horizontal(),
		local_size.y() - margin.vertical()
	};

	// 确保可用空间不为负
	available_size = available_size.cwiseMax(Eigen::Vector2f::Zero());

	// 计算子部件的位置和大小
	Eigen::Vector2f child_size = child_desired_size; // 默认使用期望尺寸
	Eigen::Vector2f child_pos  = margin.top_left();  // 初始位置包含左上边距

	// 水平对齐计算 - 考虑margin后的可用空间
	switch (h_alignment) {
		case horizontal_alignment_t::left:
			// 左对齐 - 已包含左边距
			break;
		case horizontal_alignment_t::center:
			// 中心对齐 - 位置居中加左边距
			child_pos.x() = margin.left + (available_size.x() - child_desired_size.x()) / 2;
			break;
		case horizontal_alignment_t::right:
			// 右对齐 - 考虑右边距
			child_pos.x() = local_size.x() - child_desired_size.x() - margin.right;
			break;
		case horizontal_alignment_t::stretch:
			// 拉伸 - 使用全部可用宽度
			child_size.x() = available_size.x();
			break;
		default:
			break;
	}

	// 垂直对齐计算 - 考虑margin后的可用空间
	switch (v_alignment) {
		case vertical_alignment_t::top:
			// 顶部对齐 - 已包含上边距
			break;
		case vertical_alignment_t::center:
			// 中心对齐 - 位置居中加上边距
			child_pos.y() = margin.top + (available_size.y() - child_desired_size.y()) / 2;
			break;
		case vertical_alignment_t::bottom:
			// 底部对齐 - 考虑下边距
			child_pos.y() = local_size.y() - child_desired_size.y() - margin.bottom;
			break;
		case vertical_alignment_t::stretch:
			// 拉伸 - 使用全部可用高度
			child_size.y() = available_size.y();
			break;
		default:
			break;
	}

	// 创建子几何体并添加到排列的子元素中
	const auto child_geo = in_allotted_geometry.make_child(child_pos, child_size);
	child_widget->set_geometry(child_geo);
}
