#pragma once

#ifndef VIVID2D_MULTISELECTIONBOXRENDERER_H
#define VIVID2D_MULTISELECTIONBOXRENDERER_H

#include <glm/glm.hpp>
#include <algorithm>

#include "../model/util/BoundingBox.h"
#include "RenderSystem.h"
#include "buffer/Tesselator.h"
#include "buffer/BufferBuilder.h"

namespace Vivid2D::Render {

    using Buffer::BufferBuilder;
    using Buffer::Tesselator;
    using util::BoundingBox;

    /**
     * @brief MultiSelectionBoxRenderer - 负责绘制单选和多选的边界框、手柄和中心点。
     * * 这是一个静态工具类，用于封装所有复杂的几何体构建逻辑，将绘制任务提交给 Tesselator。
     */
    class VIVID_2D_MYDLL_API MultiSelectionBoxRenderer {
    private:
        // -------------------- 配置常量（可调） --------------------
        // 尺寸
        static constexpr float DEFAULT_CORNER_SIZE = 8.0f;
        static constexpr float DEFAULT_BORDER_THICKNESS = 2.5f;
        static constexpr float DEFAULT_DASH_LENGTH = 10.0f;
        static constexpr float DEFAULT_GAP_LENGTH = 6.0f;

        // 视觉厚度分层
        static constexpr float OUTER_BORDER_THICKNESS = 2.2f;
        static constexpr float MAIN_BORDER_THICKNESS = 0.6f;
        static constexpr float INNER_BORDER_THICKNESS = 0.2f;

        // 手柄与中心点尺寸
        static constexpr float HANDLE_CORNER_SIZE = DEFAULT_CORNER_SIZE;
        static constexpr float HANDLE_MID_SIZE = 2.8f;
        static constexpr float CENTER_LINE_THICKNESS = 1.2f;
        static constexpr float CENTER_RING_RADIUS = 5.0f;
        static constexpr float CENTER_RING_THICKNESS = 1.2f;

        // 颜色（glm::vec4 替换 Vector4f）
        static const glm::vec4 DASHED_BORDER_COLOR;
        static const glm::vec4 SOLID_BORDER_COLOR_OUTER;
        static const glm::vec4 SOLID_BORDER_COLOR_MAIN;
        static const glm::vec4 SOLID_BORDER_COLOR_INNER;
        static const glm::vec4 HANDLE_COLOR;
        static const glm::vec4 MULTI_SELECTION_HANDLE_COLOR;
        static const glm::vec4 CENTER_POINT_COLOR;

        // -------------------- 辅助绘图方法（在 .cpp 中实现） --------------------

        static void addFilledQuad(BufferBuilder& bb, float x0, float y0, float x1, float y1);
        static void addHandleQuad(BufferBuilder& bb, float cx, float cy, float size);
        static void addQuadLine(BufferBuilder& bb, float x0, float y0, float x1, float y1, float thickness);

        // C++ 中为了简单起见，明确传入 4 个点的坐标 (minX, minY, maxX, minY, maxX, maxY, minX, maxY)
        static void addQuadLineLoop(BufferBuilder& bb, float thickness,
            float x0, float y0, float x1, float y1, float x2, float y2, float x3, float y3);

        static void addRing(BufferBuilder& bb, float cx, float cy, float radius, float thickness, int segments);

        static void addDashedLineVertices(BufferBuilder& bb, float startX, float startY, float endX, float endY,
            float dashLen, float gapLen);

    public:
        // 禁用构造函数 (静态工具类)
        MultiSelectionBoxRenderer() = delete;

        /**
         * @brief 绘制单选的选择框（主入口）
         *
         * @param bounds 包围盒（世界坐标）。必须是有效的。
         * @param pivot  旋转中心 / 中心点（世界坐标）。
         */
        static void drawSelectBox(const BoundingBox& bounds, const glm::vec2& pivot);

        /**
         * @brief 绘制多选框（虚线 + 手柄）
         *
         * @param multiBounds 多选包围盒。必须是有效的。
         */
        static void drawMultiSelectionBox(const BoundingBox& multiBounds);
    };

} // namespace com::chuangzhou::vivid2D::render

#endif // VIVID2D_MULTISELECTIONBOXRENDERER_H