#pragma once
/**
 * @file widget_size.h
 * @brief 定义控制UI组件大小策略的结构
 *
 * 本文件定义了widget_size结构体，用于声明组件的大小策略，
 * 可以是自动大小（根据内容）或拉伸（占用可用空间的比例）。
 */

#include <optional>

/**
 * @struct widget_size
 * @brief 控制UI组件大小策略的数据结构
 *
 * 提供两种大小策略：
 * 1. 自动大小(Auto Size) - 根据组件内容自动确定大小
 * 2. 拉伸(Stretch) - 按指定的拉伸因子分配可用空间
 */
struct widget_size {
	//-------------- 静态构造函数 --------------

	/**
	 * @brief 创建自动大小策略
	 * @return 配置为自动大小的widget_size实例
	 *
	 * 组件将根据其内容自动确定大小。
	 */
	static auto auto_size() {
		return widget_size();
	}

	/**
	 * @brief 创建拉伸大小策略
	 * @param in_stretch 拉伸因子
	 * @return 配置为拉伸大小的widget_size实例
	 *
	 * 组件将根据拉伸因子获取可用空间的比例份额。
	 */
	static auto stretch(float in_stretch) {
		return widget_size(in_stretch);
	}

	//-------------- 查询方法 --------------

	/**
	 * @brief 检查是否为自动大小策略
	 * @return 如果是自动大小策略则返回true
	 */
	bool is_auto_size() const {
		return !stretch_.has_value();
	}

	/**
	 * @brief 获取拉伸因子
	 * @return 拉伸因子值，如果是自动大小则返回0
	 */
	float stretch() const {
		return stretch_.value_or(0);
	}

	//-------------- 修改方法 --------------

	/**
	 * @brief 设置拉伸因子
	 * @param in_stretch 要设置的拉伸因子
	 *
	 * 将大小策略更改为拉伸模式，并设置拉伸因子。
	 */
	void set_stretch(float in_stretch) {
		stretch_ = in_stretch;
	}

	/**
	 * @brief 设置为自动大小策略
	 *
	 * 将大小策略更改为自动大小模式。
	 */
	void set_auto_size() {
		stretch_.reset();
	}

private:
	//-------------- 构造函数 --------------

	/**
	 * @brief 默认构造函数，创建自动大小策略
	 */
	widget_size() = default;

	/**
	 * @brief 带参构造函数，创建拉伸大小策略
	 * @param in_stretch 拉伸因子
	 */
	widget_size(float in_stretch) : stretch_(in_stretch) {}

	//-------------- 成员变量 --------------

	/**
	 * 拉伸因子，当有值时表示拉伸大小策略，否则表示自动大小策略
	 */
	std::optional<float> stretch_;
};
