#pragma once
/**
 * @file mirage_paint_context.h
 * @brief 定义用于组件绘制的上下文
 *
 * 本文件定义了mirage_paint_context类，它提供了UI组件绘制所需的上下文环境，
 * 包括渲染元素、几何信息、层级管理等功能。
 */

#include "render_elements.h"
#include "geometry/geometry.h"

/**
 * @struct mirage_paint_context
 * @brief 绘制上下文结构，提供组件绘制所需的环境和功能
 *
 * mirage_paint_context负责管理绘制过程中的状态，包括当前绘制的组件、
 * 绘制层级、几何区域和渲染元素等。它是连接UI系统和底层渲染系统的桥梁。
 */
struct mirage_paint_context {
    //-------------- 初始化 --------------

    /**
     * @brief 初始化绘制上下文
     * @param in_size 绘制区域的大小
     *
     * 根据指定大小初始化绘制上下文的内部状态。
     */
    void init(const Eigen::Vector2i& in_size);

    /**
     * @brief 重置绘制上下文状态
     *
     * 将上下文状态恢复到初始值，通常在绘制帧结束时调用。
     */
    void reset();

    //-------------- 帧控制 --------------

    /**
     * @brief 开始一个绘制帧
     * @param in_parent_widget 当前绘制的父组件
     *
     * 初始化新的绘制帧，设置父组件和相关状态。
     */
    void begin_frame();

    /**
     * @brief 结束当前绘制帧
     *
     * 完成当前帧的渲染并重置上下文状态。
     */
    void end_frame() { elements_.end_frame(); reset(); }

    //-------------- 图层管理 --------------

    /**
     * @brief 切换到下一个绘制层
     *
     * 增加当前层级计数，用于控制绘制元素的Z顺序。
     */
    void next_layer() { ++layer_; }

    /**
     * @brief 获取当前绘制层级
     * @return 当前层级值
     */
    [[nodiscard]] auto current_layer() const { return layer_; }

    //-------------- 渲染和几何 --------------

    /**
     * @brief 获取渲染元素集合
     * @return 渲染元素集合的引用
     */
    [[nodiscard]] auto& drawer() { return elements_; }

    /**
     * @brief 获取当前几何区域
     * @return 当前几何区域的引用
     */
    [[nodiscard]] const auto& geo() { return *geometry_; }

    /**
     * @brief 更新投影矩阵
     * @param in_size 新的视口大小
     *
     * 当视口大小变化时，更新渲染所需的投影矩阵。
     */
    void update_projection_matrix(const Eigen::Vector2i& in_size) { elements_.update_projection_matrix(in_size); }

    /**
     * @brief 设置当前几何区域
     * @param in_geometry 要设置的几何区域
     */
    void set_geometry(const geometry_t& in_geometry) { geometry_ = &in_geometry; }

private:
    /** 当前几何区域指针 */
    const geometry_t* geometry_{};

    /** 渲染元素集合，用于实际绘制操作 */
    render_elements elements_;

    /** 父组件是否启用的标志 */
    bool parent_enabled_{};

    /** 当前绘制层级 */
    uint32_t layer_{};
};
