<script setup lang="ts">
import type { SimpleFlowNode } from '../consts';

import { BpmNodeTypeEnum } from '@vben/constants';

import { useWatchNode } from '../helpers';
import ChildProcessNode from './nodes/child-process-node.vue';
import CopyTaskNode from './nodes/copy-task-node.vue';
import DelayTimerNode from './nodes/delay-timer-node.vue';
import EndEventNode from './nodes/end-event-node.vue';
import ExclusiveNode from './nodes/exclusive-node.vue';
import InclusiveNode from './nodes/inclusive-node.vue';
import ParallelNode from './nodes/parallel-node.vue';
import RouterNode from './nodes/router-node.vue';
import StartUserNode from './nodes/start-user-node.vue';
import TriggerNode from './nodes/trigger-node.vue';
import UserTaskNode from './nodes/user-task-node.vue';

defineOptions({ name: 'ProcessNodeTree' });

const props = defineProps({
  parentNode: {
    type: Object as () => SimpleFlowNode,
    default: () => null,
  },
  flowNode: {
    type: Object as () => SimpleFlowNode,
    default: () => null,
  },
});

const emits = defineEmits<{
  recursiveFindParentNode: [
    nodeList: SimpleFlowNode[],
    currentNode: SimpleFlowNode,
    nodeType: number,
  ];
  'update:flowNode': [node: SimpleFlowNode | undefined];
}>();

const currentNode = useWatchNode(props);

// 用于删除节点

const handleModelValueUpdate = (updateValue: any) => {
  emits('update:flowNode', updateValue);
};

const findParentNode = (nodeList: SimpleFlowNode[], nodeType: number) => {
  emits('recursiveFindParentNode', nodeList, props.parentNode, nodeType);
};

// 递归从父节点中查询匹配的节点
function recursiveFindParentNode(
  nodeList: SimpleFlowNode[],
  findNode: SimpleFlowNode,
  nodeType: number,
) {
  if (!findNode) {
    return;
  }
  if (findNode.type === BpmNodeTypeEnum.START_USER_NODE) {
    nodeList.push(findNode);
    return;
  }

  if (findNode.type === nodeType) {
    nodeList.push(findNode);
  }
  emits('recursiveFindParentNode', nodeList, props.parentNode, nodeType);
}
</script>
<template>
  <!-- 发起人节�?-->
  <StartUserNode
    v-if="currentNode && currentNode.type === BpmNodeTypeEnum.START_USER_NODE"
    :flow-node="currentNode"
  />
  <!-- 审批节点 -->
  <UserTaskNode
    v-if="
      currentNode &&
      (currentNode.type === BpmNodeTypeEnum.USER_TASK_NODE ||
        currentNode.type === BpmNodeTypeEnum.TRANSACTOR_NODE)
    "
    :flow-node="currentNode"
    @update:flow-node="handleModelValueUpdate"
    @find-parent-node="findParentNode"
  />
  <!-- 抄送节�?-->
  <CopyTaskNode
    v-if="currentNode && currentNode.type === BpmNodeTypeEnum.COPY_TASK_NODE"
    :flow-node="currentNode"
    @update:flow-node="handleModelValueUpdate"
  />
  <!-- 条件节点 -->
  <ExclusiveNode
    v-if="
      currentNode && currentNode.type === BpmNodeTypeEnum.CONDITION_BRANCH_NODE
    "
    :flow-node="currentNode"
    @update:model-value="handleModelValueUpdate"
    @find-parent-node="findParentNode"
  />
  <!-- 并行节点 -->
  <ParallelNode
    v-if="
      currentNode && currentNode.type === BpmNodeTypeEnum.PARALLEL_BRANCH_NODE
    "
    :flow-node="currentNode"
    @update:model-value="handleModelValueUpdate"
    @find-parent-node="findParentNode"
  />
  <!-- 包容分支节点 -->
  <InclusiveNode
    v-if="
      currentNode && currentNode.type === BpmNodeTypeEnum.INCLUSIVE_BRANCH_NODE
    "
    :flow-node="currentNode"
    @update:model-value="handleModelValueUpdate"
    @find-parent-node="findParentNode"
  />
  <!-- 延迟器节�?-->
  <DelayTimerNode
    v-if="currentNode && currentNode.type === BpmNodeTypeEnum.DELAY_TIMER_NODE"
    :flow-node="currentNode"
    @update:flow-node="handleModelValueUpdate"
  />
  <!-- 路由分支节点 -->
  <RouterNode
    v-if="
      currentNode && currentNode.type === BpmNodeTypeEnum.ROUTER_BRANCH_NODE
    "
    :flow-node="currentNode"
    @update:flow-node="handleModelValueUpdate"
  />
  <!-- 触发器节�?-->
  <TriggerNode
    v-if="currentNode && currentNode.type === BpmNodeTypeEnum.TRIGGER_NODE"
    :flow-node="currentNode"
    @update:flow-node="handleModelValueUpdate"
  />
  <!-- 子流程节�?-->
  <ChildProcessNode
    v-if="
      currentNode && currentNode.type === BpmNodeTypeEnum.CHILD_PROCESS_NODE
    "
    :flow-node="currentNode"
    @update:flow-node="handleModelValueUpdate"
  />
  <!-- 递归显示孩子节点  -->
  <ProcessNodeTree
    v-if="currentNode && currentNode.childNode"
    v-model:flow-node="currentNode.childNode"
    :parent-node="currentNode"
    @recursive-find-parent-node="recursiveFindParentNode"
  />

  <!-- 结束节点 -->
  <EndEventNode
    v-if="currentNode && currentNode.type === BpmNodeTypeEnum.END_EVENT_NODE"
    :flow-node="currentNode"
  />
</template>
