/**
 * 知识库数据分组层（交互层与分组维度完全解耦）
 *
 * 本模块职责：
 * - 接收 items 数组，按指定维度生成分组树数据
 * - 完全不涉及 UI（无 React 组件、无 Ant Design 引用）
 *
 * 将来切换为「按主题/装备分组」时：
 * - 只改本文件中的 groupItemsBySource 函数
 * - 前端 KnowledgeTree 组件一行都不用动
 */

/**
 * ============================================================
 * 📌 二级分组维度映射表（核心配置，一处可改）
 * ============================================================
 * key = source_type，value = 用来做二级分组的字段名（取 items 里的字段）
 * null = 该大类不建二级节点，条目直接挂在大类下
 *
 * 当前配置：
 * - manuscript（节目文稿）    → 按 author（作者/编导）归堆
 * - military_report（杂志文章）→ 按 source_detail（出处）归堆
 * - baoti（报题单）          → 不分组
 * - manual（其他）            → 不分组
 *
 * 将来调整某类的二级维度，只需改这一张表，本文件分组逻辑全部收敛。
 */
const SECONDARY_GROUP_FIELD = {
  manuscript: 'author',           // 节目文稿 → 按作者(编导)
  military_report: 'source_detail', // 杂志文章 → 按出处
  baoti: null,                    // 报题单 → 不分组
  manual: null,                   // 其他 → 不分组
}

/**
 * ============================================================
 * 📌 来源大类固定显示顺序（制片人 Obsidian 习惯）
 * ============================================================
 * 即使某类暂时为空也按此顺序； 有数据时即按此次序排列。
 * 已有类别按此次序排，未知类别兜底排末尾。
 */
const SOURCE_TYPE_ORDER = [
  'manuscript',      // 节目文稿
  'military_report', // 杂志文章
  'baoti',           // 报题单
  'manual',          // 其他
]

/**
 * source_type 中文标签
 */
const SOURCE_TYPE_LABEL = {
  military_report: '杂志文章',
  manuscript: '节目文稿',
  baoti: '报题单',
  manual: '其他',
}

/**
 * 按来源（source_type → 二级字段）分组
 * @param {Array} items - 知识库条目数组，含 source_type 字段，及 SECONDARY_GROUP_FIELD 中指定的二级字段
 * @returns {Array} 树形结构数据，供 KnowledgeTree 组件渲染
 *
 * 返回格式：
 * [
 *   {
 *     key: "all",
 *     label: "全部（N条）",
 *     count: 总条目数,
 *     children: [
 *       {
 *         key: "manuscript",
 *         label: "节目文稿（n条）",
 *         count: n,
 *         children: [  // SECONDARY_GROUP_FIELD[st] 为 null 时为空数组
 *           { key: "manuscript|author|左鑫", label: "左鑫（3条）", count: 3 }
 *         ]
 *       },
 *       ...
 *     ]
 *   }
 * ]
 *
 * 二级节点 key 格式：`{source_type}|{二级字段名}|{字段值}`
 * 例：manuscript|author|左鑫
 *     military_report|source_detail|航空知识 2026年第1期
 *
 * 注意：
 * - 二级字段值为 null / 空字串 → 归入对应大类，不造空节点
 * - 无效的 source_type → 归入 'manual' 大类
 */
export function groupItemsBySource(items) {
  const totalCount = items.length

  // 按 source_type 分组（按固定顺序遍历）
  const typeGroups = {}
  // 初始化所有已知类别，确保空类别也出现在树中
  for (const st of SOURCE_TYPE_ORDER) {
    typeGroups[st] = []
  }

  for (const item of items) {
    const st = item.source_type || 'manual'
    // 未知类别兜底（如 'journal' 等新加类型）
    if (!typeGroups[st]) {
      typeGroups[st] = []
    }
    typeGroups[st].push(item)
  }

  const children = []

  // 按固定顺序遍历 SOURCE_TYPE_ORDER
  for (const st of SOURCE_TYPE_ORDER) {
    const stItems = typeGroups[st] || []
    if (stItems.length === 0) {
      // 空类别也按顺序出现在树中（0条）
      children.push({
        key: st,
        label: `${SOURCE_TYPE_LABEL[st] || st}（0条）`,
        count: 0,
        children: [],
      })
      continue
    }

    const secondaryField = SECONDARY_GROUP_FIELD[st] || null
    const grandchildren = []

    if (secondaryField !== null) {
      // 按二级字段分组
      const detailGroups = {}
      for (const item of stItems) {
        // 取二级字段值，null/空字串统一为 null 处理（不造空节点）
        const sd = (item[secondaryField] || '').trim() || null
        if (!detailGroups[sd]) {
          detailGroups[sd] = []
        }
        detailGroups[sd].push(item)
      }

      for (const [sd, sdItems] of Object.entries(detailGroups)) {
        if (sd !== null) {
          // 二级节点 key 格式：type|fieldName|fieldValue
          grandchildren.push({
            key: `${st}|${secondaryField}|${sd}`,
            label: `${sd}（${sdItems.length}条）`,
            count: sdItems.length,
          })
        }
      }
    }
    // secondaryField 为 null 时，grandchildren 保持为空数组 → 大类直接可点击

    children.push({
      key: st,
      label: `${SOURCE_TYPE_LABEL[st] || st}（${stItems.length}条）`,
      count: stItems.length,
      children: grandchildren,
    })
  }

  return [
    {
      key: 'all',
      label: `全部（${totalCount}条）`,
      count: totalCount,
      children,
    },
  ]
}