#pragma once
/**
 * @file margin.h
 * @brief 定义描述UI元素边距的结构
 *
 * 本文件定义了margin_t结构体，用于表示UI元素的四边边距。
 * 边距可以是均匀的、水平/垂直对称的，或者四边各不相同。
 */

#include <Eigen/Eigen>

/**
 * @struct margin_t
 * @brief 表示UI元素的边距结构
 *
 * margin_t描述了一个UI元素的左、右、上、下四个方向的边距。
 * 提供了多种构造方式和实用函数，用于布局计算和几何操作。
 */
struct margin_t {
    //-------------- 成员变量 --------------

    /** 左边距 */
    float left = 0;

    /** 右边距 */
    float right = 0;

    /** 上边距 */
    float top = 0;

    /** 下边距 */
    float bottom = 0;

    //-------------- 构造函数 --------------

    /**
     * @brief 默认构造函数，创建零边距
     */
    margin_t() = default;

    /**
     * @brief 均匀边距构造函数
     * @param in_uniform 应用于所有边的统一边距值
     */
    margin_t(float in_uniform) : left(in_uniform), right(in_uniform), top(in_uniform), bottom(in_uniform) {}

    /**
     * @brief 水平/垂直对称边距构造函数
     * @param in_horizontal 左右边距值
     * @param in_vertical 上下边距值
     */
    margin_t(float in_horizontal, float in_vertical) : left(in_horizontal), right(in_horizontal), top(in_vertical), bottom(in_vertical) {}

    /**
     * @brief 完整边距构造函数
     * @param in_left 左边距
     * @param in_right 右边距
     * @param in_top 上边距
     * @param in_bottom 下边距
     */
    margin_t(float in_left, float in_right, float in_top, float in_bottom) : left(in_left), right(in_right), top(in_top), bottom(in_bottom) {}

    //-------------- 静态工厂方法 --------------

    /**
     * @brief 创建均匀边距
     * @param in_uniform 应用于所有边的统一边距值
     * @return 新创建的均匀边距
     */
    static auto all(float in_uniform) { return margin_t(in_uniform); }

    /**
     * @brief 创建水平/垂直对称边距
     * @param in_horizontal 左右边距值
     * @param in_vertical 上下边距值
     * @return 新创建的对称边距
     */
    static auto symmetric(float in_horizontal, float in_vertical) { return margin_t(in_horizontal, in_vertical); }

    //-------------- 位置和尺寸计算 --------------

    /**
     * @brief 获取左上角偏移量
     * @return 包含左边距和上边距的向量
     */
    auto top_left() const {
        return Eigen::Vector2f(left, top);
    }

    /**
     * @brief 获取右下角偏移量
     * @return 包含右边距和下边距的向量
     */
    auto right_bottom() const {
        return Eigen::Vector2f(right, bottom);
    }

    /**
     * @brief 计算水平方向的总边距
     * @return 左右边距之和
     */
    auto horizontal() const {
        return left + right;
    }

    /**
     * @brief 计算垂直方向的总边距
     * @return 上下边距之和
     */
    auto vertical() const {
        return top + bottom;
    }

    /**
     * @brief 计算边距的面积
     * @return 水平总边距乘以垂直总边距
     */
    auto area() const {
        return horizontal() * vertical();
    }

    /**
     * @brief 获取边距的总大小
     * @return 包含水平和垂直总边距的向量
     */
    auto size() const {
        return Eigen::Vector2f(horizontal(), vertical());
    }

    //-------------- 实用函数 --------------

    /**
     * @brief 检查是否为零边距
     * @return 如果所有边距都为零则返回true
     */
    auto is_zero() const {
        return left == 0 && right == 0 && top == 0 && bottom == 0;
    }

    /**
     * @brief 获取总间距向量
     * @return 包含水平和垂直总边距的向量
     */
    auto get_total_spacing() const {
        return Eigen::Vector2f(left + right, top + bottom);
    }
};
