import { ref, watch } from 'vue';
import { fetchGetExecutionRequirementOptions } from '@/service/api/project';

export interface ProjectRequirementTreeNode {
  id: string;
  title: string;
  statusCode: string;
  children?: ProjectRequirementTreeNode[];
}

/**
 * 拉取当前项目的项目需求并按 parentId 构造为树，供 ElTreeSelect 使用。
 *
 * 设计：
 * - 走 `/page` 接口拿扁平列表，前端自己按 `parentId` 关系构树。
 *   不用后端 `/tree` 接口是因为它有未明确的过滤条件（实测对当前项目返回空）。
 * - 不在前端做"终态过滤"——前端硬编码的终态集合与后端实际状态不一致，
 *   全显示，由用户挑选；选到后端拒绝的状态时会通过 1_008_003_025 等错误码反馈。
 * - 不在挂载时自动拉取——由调用方在"弹层打开/真正用到时"显式 reload()，
 *   避免页面挂载后到打开弹层期间数据陈旧。
 */
export function useProjectRequirementOptions(projectId: () => string | null) {
  const treeData = ref<ProjectRequirementTreeNode[]>([]);
  const loading = ref(false);

  async function reload() {
    const id = projectId();
    if (!id) {
      treeData.value = [];
      return;
    }

    loading.value = true;
    try {
      const { data, error } = await fetchGetExecutionRequirementOptions({
        projectId: id,
        pageNo: 1,
        pageSize: -1
      });

      if (error || !data?.list) {
        treeData.value = [];
        return;
      }

      treeData.value = buildTree(data.list);
    } finally {
      loading.value = false;
    }
  }

  /**
   * 将扁平 requirement 列表按 parentId 关系构造为树。
   * parentId === '0' 视为根节点（与后端约定，见 `ProjectRequirement.parentId` 注释）。
   * parentId 不在当前 list 中的节点（孤儿）也作为根节点展示，避免被"吞掉"。
   */
  function buildTree(list: Api.Project.ProjectRequirement[]): ProjectRequirementTreeNode[] {
    const nodeMap = new Map<string, ProjectRequirementTreeNode>();
    list.forEach(item => {
      nodeMap.set(item.id, {
        id: item.id,
        title: item.title,
        statusCode: item.statusCode,
        children: []
      });
    });

    const roots: ProjectRequirementTreeNode[] = [];
    list.forEach(item => {
      const node = nodeMap.get(item.id)!;
      const parent = item.parentId !== '0' ? nodeMap.get(item.parentId) : null;
      if (parent) {
        parent.children!.push(node);
      } else {
        roots.push(node);
      }
    });

    // 清掉空的 children 数组，避免 ElTreeSelect 显示"叶子节点带展开箭头"
    function pruneEmptyChildren(nodes: ProjectRequirementTreeNode[]) {
      nodes.forEach(node => {
        if (node.children && node.children.length === 0) {
          delete node.children;
        } else if (node.children) {
          pruneEmptyChildren(node.children);
        }
      });
    }

    pruneEmptyChildren(roots);

    return roots;
  }

  // projectId 变化时清空旧数据（避免跨项目切换时短暂闪现上一项目的需求）
  watch(projectId, () => {
    treeData.value = [];
  });

  return { treeData, loading, reload };
}
