#pragma once
#ifndef VIVID2D_VERTEX_H
#define VIVID2D_VERTEX_H

#include <glm/glm.hpp>
#include <vector>
#include <string>
#include <iostream>
#include <algorithm>
#include <stdexcept>

namespace Vivid2D::util {

    /**
     * @brief 顶点标签枚举，用于标识顶点的特定类型或用途。
     */
    enum class VIVID_2D_MYDLL_API VertexTag {
        /**
		* 用于变形的顶点
		*/
        DEFORMATION,

        /**
         * 默认的顶点
         */
        DEFAULT,

        /**
         * 其他类型的顶点
         */
        OTHER
    };

    /**
     * @brief 封装一个2D顶点，包含位置、UV坐标和原始位置。
     *
     * 对应 Java 类 Vertex。
     */
    class VIVID_2D_MYDLL_API Vertex {
    private:
        std::vector<int> controlledTriangles;
        VertexTag tag;
        bool selected;
        std::string name;
        bool IsDelete;

    public:
        glm::vec2 position;       // 当前顶点位置 (x, y)
        glm::vec2 uv;             // UV坐标 (u, v)
        glm::vec2 originalPosition; // 原始顶点位置 (用于变形)
        int index;                // 顶点索引

        /**
         * @brief 构造函数
         *
         * @param x 顶点 x 坐标
         * @param y 顶点 y 坐标
         * @param u 顶点 u 坐标
         * @param v 顶点 v 坐标
         */
        Vertex(float x, float y, float u, float v);

        /**
         * @brief 构造函数
         *
         * @param position 顶点位置
         * @param uv       UV坐标
         */
        Vertex(const glm::vec2& position, const glm::vec2& uv);

        /**
         * @brief 构造函数
         */
        Vertex(const glm::vec2& position, const glm::vec2& uv, VertexTag tag);

        /**
         * @brief 构造函数（用于复制）
         *
         * @param position         顶点位置
         * @param uv               UV坐标
         * @param originalPosition 原始位置
         */
        Vertex(const glm::vec2& position, const glm::vec2& uv, const glm::vec2& originalPosition);

        /**
         * @brief 便捷构造函数，用于仅通过位置创建顶点
         * UV坐标将默认为 (0, 0)。
         *
         * @param x 顶点 x 坐标
         * @param y 顶点 y 坐标
         */
        Vertex(float x, float y);

        // 析构函数（如果类中有需要释放的动态资源，则需要自定义，但这里不需要）
        // ~Vertex() = default;

        // 拷贝构造函数和拷贝赋值运算符（用于深拷贝）
        Vertex(const Vertex& other);
        Vertex& operator=(const Vertex& other);

        // 移动构造函数和移动赋值运算符
        // Vertex(Vertex&& other) noexcept = default;
        // Vertex& operator=(Vertex&& other) noexcept = default;


        // --- Getters 和 Setters ---

        VertexTag getTag() const { return tag; }
        void setTag(VertexTag tag) { this->tag = tag; }

        void setIndex(int index) { this->index = index; }
        int getIndex() const { return index; }

        void deleteVertex() { IsDelete = true; }
        bool isDelete() const { return IsDelete; }

        void setSelected(bool selected) { this->selected = selected; }
        bool isSelected() const { return selected; }

        void setName(const std::string& name) { this->name = name; }
        const std::string& getName() const { return name; }

        const std::vector<int>& getControlledTriangles() const { return controlledTriangles; }
        void setControlledTriangles(const std::vector<int>& controlledTriangles);

        // --- 核心逻辑方法 ---

        /**
         * @brief 重置为原始位置
         */
        void resetToOriginal();

        /**
         * @brief 保存当前位置为新的原始位置
         */
        void saveAsOriginal();

        /**
         * @brief 创建此顶点的深拷贝 (对应Java中的copy())
         */
        Vertex copy() const;

        // --- C++ 特性：重载运算符和输出流 ---

        /**
         * @brief 重载相等运算符 (对应 Java 中的 equals())
         */
        bool operator==(const Vertex& other) const;

        /**
         * @brief 重载不等运算符
         */
        bool operator!=(const Vertex& other) const {
            return !(*this == other);
        }

        /**
         * @brief 重载输出流运算符 (对应 Java 中的 toString())
         */
        friend std::ostream& operator<<(std::ostream& os, const Vertex& vertex);

    };

} // util

#endif // VIVID2D_VERTEX_H

