class ExtensionUtil {
  /**
   * 从多个目录获取文件
   * @param {*} wepContext WEP目录
   * @param {*} productContext 产品目录，多个
   * @param {*} customContext 扩展目录
   * @returns {any[]} 获取到的所有文件
   */
  parse(wepContext, productContext, customContext) {
    const results = []
    const fn = (fileName, context, { isWEP = false, isProduct = false, isCustom = false }) => {
      const filenameSeg = fileName.split('/')
      results.push({
        path: fileName,
        fileName: filenameSeg[filenameSeg.length - 1],
        getModule: () => context(fileName),
        productKey: isProduct ? filenameSeg[1] : undefined,
        isWEP,
        isProduct,
        isCustom,
      })
    }
    wepContext.keys().forEach((name) => fn(name, wepContext, { isWEP: true }))
    productContext.keys().forEach((name) => fn(name, productContext, { isProduct: true }))
    customContext.keys().forEach((name) => fn(name, customContext, { isCustom: true }))
    return results
  }

  /**
   * 从多个目录获取文件，按目录分组
   * @param {*} wepContext WEP目录
   * @param {*} productContext 产品目录，多个
   * @param {*} customContext 扩展目录
   * @returns {any[]} 获取到的所有文件
   */
  parseWithCategory(wepContext, productContext, customContext) {
    const results = []
    this.parse(wepContext, productContext, customContext).forEach((file) => {
      let key
      if (file.isWEP) {
        key = 'wep'
      } else if (file.isCustom) {
        key = 'custom'
      } else {
        key = file.productKey
      }
      let category = results.find((result) => result.key === key)
      if (!category) {
        // 分类没找到，添加进去
        let productName
        if (file.isProduct) {
          productName = productInfos.find((info) => info.directory === key)?.name || key
        }

        category = {
          key,
          name: productName,
          files: [],
        }
        results.push(category)
      }
      category.files.push(file)
    })
    return results
  }
}

// 从产品目录的 metadata.json，获取产品中文名
const productContext = require.context('../../../src_product', true, /metadata\.json$/)
const productInfos = productContext.keys().map((fileName) => {
  return {
    directory: fileName.split('/')[1],
    ...productContext(fileName),
  }
})

export default new ExtensionUtil()
