const path = require('path')
const SingleEntryDependency = require('./dependencies/SingleEntryDependency')

class LibManifestPlugin {
  constructor (options) {
    this.options = options
  }

  apply (compiler) {
    compiler.hooks.emit.tapAsync('RedevelopmentManifestPlugin', (compilation, callback) => {
      const targetPath = compilation.getPath(this.options.path, {
        hash: compilation.hash
      })
      const name =
      this.options.name &&
      compilation.getPath(this.options.name, {
        hash: compilation.hash
      })

      const manifest = {
        gitCommit: '',
        name, // 为了二次开发设置一个全局变量指向 __webpack_require__
        type: this.options.type,
        content:{}
      }
      if (process.env.GIT_COMMIT_VERSION){
        manifest.gitCommit = process.env.GIT_COMMIT_VERSION
      }
      compilation.chunks.forEach((chunk) => {
        if (!chunk.isOnlyInitial()) {
          return
        }

        const content = Array.from(chunk.modulesIterable, module => {
          if (this.options.entryOnly && !module.reasons.some(r => r.dependency instanceof SingleEntryDependency)) {
            return
          }
          if (module.libIdent) {
            const ident = module.libIdent({
              context: this.options.context || compiler.options.context
            })
            if (ident) {
              return {
                ident,
                data: {
                  id: module.id,
                  buildMeta: module.buildMeta
                }
              }
            }
          }
        })
          .filter(Boolean)
          .reduce((obj, item) => {
            obj[item.ident] = item.data
            return obj
          }, Object.create(null))

        Object.assign(manifest.content, content)
      })
      const manifestContent = this.options.format ? JSON.stringify(manifest, null, 2) : JSON.stringify(manifest)
      const content = Buffer.from(manifestContent, 'utf8')
      compiler.outputFileSystem.mkdirp(path.dirname(targetPath), err => {
        if (err) return callback(err)
        compiler.outputFileSystem.writeFile(targetPath, content, callback)
      })
    })
  }
}
module.exports = LibManifestPlugin
