import { getDeptNameByNickName } from '@/api/oa/binding';

/*
 * withDeptName 高阶函数
 * ---------------------------------------------
 * 用途：
 *   为会话列表（如IM会话、联系人等）异步注入部门名称和部门颜色，
 *   使前端组件可直接渲染带部门信息的会话项。
 * 
 * 参数：
 *   @param {Array<Object>} conversationList - 原始会话对象数组，
 *     每项需包含唯一标识（如 showName 字段）。
 * 
 * 返回：
 *   @returns {Promise<Array<Object>>} - 返回一个 Promise，
 *     解析后为带有部门名（deptName）和部门色（color）的会话对象数组。
 *     若某项无部门信息，则不包含 deptName/color 字段。
 * 
 * 使用场景：
 *   - 会话列表、联系人列表等需要展示部门信息的场景。
 *   - 适用于任何需要根据昵称批量获取部门名的业务。
 *   - 可在 watch、生命周期、异步数据流等场景下调用。
 * 
 * 示例：
 *   import { withDeptName } from '@/util/withDeptName';
 *   const result = await withDeptName(conversationList);
 *   // result: [{...item, deptName, color}, ...]
 * 
 * 注意事项：
 *   - 依赖 getDeptNameByNickName 接口，需保证接口可用。
 *   - 仅为获取到真实部门名的项添加 deptName/color 字段。
 *   - 若接口异常或无部门名，则原项不变。
 *   - color 为自动分配的浅色系，便于前端高亮展示。
 *   - 建议在数据源变更时重新调用。
 */
export async function withDeptName(conversationList) {
  const nicknames = conversationList.map(item => item.showName);
  let deptMap = {};
  try {
    const res = await getDeptNameByNickName(nicknames);
    if (Array.isArray(res.data)) {
      res.data.forEach(obj => {
        if (obj && obj.nickName && obj.deptName) {
          deptMap[obj.nickName] = obj.deptName;
        }
      });
    }
  } catch (e) {
    deptMap = {};
  }
  const colorList = [
    '#FFB6C1', '#87CEFA', '#90EE90', '#FFD700', '#FFA07A',
    '#9370DB', '#00CED1', '#FF69B4', '#B0C4DE', '#40E0D0',
  ];
  const deptNameSet = new Set();
  Object.values(deptMap).forEach(deptName => {
    deptNameSet.add(deptName);
  });
  const deptNameArr = Array.from(deptNameSet);
  const deptColorMap = {};
  deptNameArr.forEach((dept, idx) => {
    deptColorMap[dept] = colorList[idx % colorList.length];
  });
  return conversationList.map(item => {
    const deptName = deptMap[item.showName];
    if (deptName) {
      return {
        ...item,
        deptName,
        color: deptColorMap[deptName] || ''
      }
    } else {
      return { ...item }
    }
  });
} 