package com.qqchen.deploy.backend.workflow.enums;

import com.fasterxml.jackson.annotation.JsonValue;
import com.qqchen.deploy.backend.workflow.dto.definition.node.localVariables.DeployNodeLocalVariables;
import com.qqchen.deploy.backend.workflow.dto.definition.node.localVariables.NotificationNodeLocalVariables;
import com.qqchen.deploy.backend.workflow.dto.definition.node.localVariables.ScriptNodeLocalVariables;
import com.qqchen.deploy.backend.workflow.dto.definition.node.panelVariables.DeployNodePanelVariables;
import com.qqchen.deploy.backend.workflow.dto.definition.node.panelVariables.EndNodePanelVariables;
import com.qqchen.deploy.backend.workflow.dto.definition.node.panelVariables.GatewayNodePanelVariables;
import com.qqchen.deploy.backend.workflow.dto.definition.node.panelVariables.NotificationNodePanelVariables;
import com.qqchen.deploy.backend.workflow.dto.definition.node.panelVariables.ScriptNodePanelVariables;
import com.qqchen.deploy.backend.workflow.dto.definition.node.panelVariables.StartNodePanelVariables;
import com.qqchen.deploy.backend.workflow.dto.definition.node.panelVariables.ApprovalNodePanelVariables;
import com.qqchen.deploy.backend.workflow.dto.definition.node.uiVariables.NodeUiVariables;
import lombok.Getter;

/**
 * 工作节点类型枚举
 * 定义了工作流中所有可用的节点类型及其UI配置
 */
@Getter
public enum NodeTypeEnums {

    /**
     * 开始节点
     * 工作流的起点，每个流程必须有且仅有一个开始节点
     * 特点:
     * - 只能有出边，不能有入边
     * - 用于触发工作流的执行
     */
    START_EVENT(
        "START_EVENT",                // 节点类型编码
        "开始节点",                    // 节点显示名称
        null,
        StartNodePanelVariables.class,
        NodeUiVariables.class,
        BpmnNodeTypeEnums.START_EVENT,
        NodeCategoryEnums.EVENT,
        "工作流开始"
    ),

    /**
     * 结束节点
     * 工作流的终点，每个流程必须有且仅有一个结束节点
     * 特点:
     * - 只能有入边，不能有出边
     * - 标志着工作流的结束
     */
    END_EVENT(
        "END_EVENT",
        "结束节点",
        null,
        EndNodePanelVariables.class,
        NodeUiVariables.class,
        BpmnNodeTypeEnums.END_EVENT,
        NodeCategoryEnums.EVENT,
        "工作流结束"
    ),
    SCRIPT_NODE(
        "SCRIPT_NODE",
        "脚本任务",
        ScriptNodeLocalVariables.class,
        ScriptNodePanelVariables.class,
        NodeUiVariables.class,
        BpmnNodeTypeEnums.SERVICE_TASK,
        NodeCategoryEnums.TASK,
        "脚本执行任务"
    ),
    DEPLOY_NODE(
        "DEPLOY_NODE",
        "构建任务",
        DeployNodeLocalVariables.class,
        DeployNodePanelVariables.class,
        NodeUiVariables.class,
        BpmnNodeTypeEnums.SERVICE_TASK,
        NodeCategoryEnums.TASK,
        "构建任务"
    ),
    GATEWAY_NODE(
        "GATEWAY_NODE",
        "网关节点",
        null,
        GatewayNodePanelVariables.class,
        NodeUiVariables.class,
        BpmnNodeTypeEnums.EXCLUSIVE_GATEWAY,
        NodeCategoryEnums.GATEWAY,
        "条件分支控制"
    ),
    NOTIFICATION_NODE(
        "NOTIFICATION_NODE",
        "通知节点",
        NotificationNodeLocalVariables.class,
        NotificationNodePanelVariables.class,
        NodeUiVariables.class,
        BpmnNodeTypeEnums.SERVICE_TASK,
        NodeCategoryEnums.TASK,
        "通知节点"
    ),
    APPROVAL_NODE(
        "APPROVAL_NODE",
        "审批节点",
        null,
        null,
        NodeUiVariables.class,
        BpmnNodeTypeEnums.USER_TASK,
        NodeCategoryEnums.TASK,
        "审批任务"
    );
//
//    /**
//     * 用户任务节点
//     * 需要人工处理的任务节点
//     * 特点:
//     * - 需要用户交互
//     * - 可以分配给特定用户或角色
//     * - 支持审批、填写表单等操作
//     */
//    USER_TASK(
//        "USER_TASK",
//        "用户任务",
//        "人工处理任务",
//        new WorkflowNodeGraph()
//            .setShape("rect")
//            .setSize(120, 60)
//            .setStyle("#ffffff", "#1890ff", "user")
//            .configPorts(Arrays.asList("in", "out"))
//    ),
//
//    /**
//     * 服务任务节点
//     * 自动执行的系统服务任务
//     * 特点:
//     * - 自动执行，无需人工干预
//     * - 可以调用外部服务或系统API
//     * - 支持异步执行
//     */
//    SERVICE_TASK(
//        "SERVICE_TASK",
//        "服务任务",
//        "系统服务调用",
//        new WorkflowNodeGraph()
//            .setShape("rectangle")
//            .setSize(120, 60)
//            .setStyle("#ffffff", "#1890ff", "api")
//            .configPorts(Arrays.asList("in", "out"))
//    ),
//
//    /**
//     * 脚本任务节点
//     * 执行自定义脚本的任务节点
//     * 特点:
//     * - 支持多种脚本语言（如Shell、Python等���
//     * - 可以执行自定义业务逻辑
//     * - 适合复杂的数据处理和计算
//     */
//    SCRIPT_TASK(
//        "SCRIPT_TASK",
//        "脚本任务",
//        "脚本执行任务",
//        new WorkflowNodeGraph()
//            .setShape("rectangle")
//            .setSize(120, 60)
//            .setStyle("#ffffff", "#1890ff", "code")
//            .configPorts(Arrays.asList("in", "out"))
//    ),
//
//    /**
//     * 排他网关
//     * 基于条件的分支控制
//     * 特点:
//     * - 只会选择一个分支执行
//     * - 需要设置分支条件
//     * - 适合互斥的业务场景
//     */
//    EXCLUSIVE_GATEWAY(
//        "EXCLUSIVE_GATEWAY",
//        "排他网关",
//        "条件分支控制",
//        new WorkflowNodeGraph()
//            .setShape("diamond")
//            .setSize(50, 50)
//            .setStyle("#fff7e6", "#faad14", "fork")
//            .configPorts(Arrays.asList("in", "out"))
//    ),
//
//    /**
//     * 并行网关
//     * 并行执行多个分支
//     * 特点:
//     * - 所有分支同时执行
//     * - 等待所有分支完成才继续
//     * - 适合并行处理的业务场景
//     */
//    PARALLEL_GATEWAY(
//        "PARALLEL_GATEWAY",
//        "并行网关",
//        "��行分支控制",
//        new WorkflowNodeGraph()
//            .setShape("diamond")
//            .setSize(50, 50)
//            .setStyle("#fff7e6", "#faad14", "branches")
//            .configPorts(Arrays.asList("in", "out"))
//    ),
//
//    /**
//     * 子流程节点
//     * 嵌套的子流程
//     * 特点:
//     * - 可以包含完整的子流程
//     * - 支持流程的模块化和复用
//     * - 可以独立部署和版本控制
//     */
//    SUBPROCESS(
//        "SUB_PROCESS",
//        "子流程",
//        "嵌入式子流程",
//        new WorkflowNodeGraph()
//            .setShape("rectangle")
//            .setSize(120, 60)
//            .setStyle("#ffffff", "#1890ff", "apartment")
//            .configPorts(Arrays.asList("in", "out"))
//    ),
//
//    /**
//     * 调用活动节点
//     * 调用外部定义的流程
//     * 特点:
//     * - 可以调用其他已定义的流程
//     * - 支持流程的复用
//     * - 可以传递参数和接收返回值
//     */
//    CALL_ACTIVITY(
//        "CALL_ACTIVITY",
//        "调用活动",
//        "调用外部定义的流程，支持跨系统流程调用和参数传递",
//        new WorkflowNodeGraph()
//            .setShape("rectangle")
//            .setSize(120, 60)
//            .setStyle("#ffffff", "#1890ff", "api")
//            .configPorts(Arrays.asList("in", "out"))
//    );

    @JsonValue
    private final String code;            // 节点类型编码

    private final String name;            // 节点显示名称

    private final Class<?> localVariables;

    private final Class<?> panelVariables;

//    private final Class<?> formVariables;

    private final Class<?> uiVariables;

    private final BpmnNodeTypeEnums bpmnType; // 对应的BPMN类型

    private final NodeCategoryEnums category; //分类

    private final String description;     // 节点详细描述

    NodeTypeEnums(
        String code,
        String name,
        Class<?> localVariables,
        Class<?> panelVariables,
//        Class<?> formVariables,
        Class<?> uiVariables,
        BpmnNodeTypeEnums bpmnType,
        NodeCategoryEnums category,
        String description
    ) {
        this.code = code;
        this.name = name;
        this.localVariables = localVariables;
        this.panelVariables = panelVariables;
//        this.formVariables = formVariables;
        this.uiVariables = uiVariables;
        this.bpmnType = bpmnType;
        this.category = category;
        this.description = description;
    }

    /**
     * 根据编码查找对应的枚举
     *
     * @param code 节点类型编码
     * @return 对应的枚举实例
     * @throws IllegalArgumentException 当找不到对应的枚举值时抛出
     */
    public static NodeTypeEnums fromValue(String code) {
        for (NodeTypeEnums type : values()) {
            if (type.code.equals(code)) {
                return type;
            }
        }
        throw new IllegalArgumentException("Unknown NodeType code: " + code);
    }
}
