text: const path = require('path')
  const { src, dest, parallel } = require('gulp')
  const modify = require('gulp-modify-file')
  const zip = require('gulp-zip')
  const { promisifyVinyl } = require('./util')
  
  
  /*
  assumes everything already built
  */
  module.exports = parallel(
    writeStandardArchive,
    writePremiumArchive
  )
  
  
  function writeStandardArchive() {
    return writeArchive({
      archiveName: 'fullcalendar',
      bundleDir: 'packages/bundle',
      exampleHtmlFiles: [
        '*.html',
        '!*+(resource|timeline)*.html',
        '!_*.html'
      ],
      exampleOtherFiles: [
        'js/*',
        'json/*',
        '!json/*resource*.json',
        'php/*'
      ],
      topLevelFiles: [
        'README.md',
        'LICENSE.txt'
      ]
    })
  }
  
  
  /*
  TODO: for examples, instead of looking for (resource|timeline) in the filename,
  leverage whether the html file includes packages-premium/bundle or not.
  */
  function writePremiumArchive() {
    return writeArchive({
      archiveName: 'fullcalendar-scheduler',
      bundleDir: 'packages-premium/bundle',
      exampleHtmlFiles: [
        '*+(resource|timeline)*.html',
        'timegrid-views-hscroll.html', // TEMPORARY. TODO: exclude this file from non-premium
        '!_*.html'
      ],
      exampleOtherFiles: [
        'js/*',
        'json/*'
      ],
      topLevelFiles: [
        'packages-premium/README.md',
        'packages-premium/LICENSE.md'
      ]
    })
  }
  
  
  function writeArchive(options) {
    let version = require(path.join(process.cwd(), 'package.json')).version
  
    return writeArchiveFiles(options).then(function(tmpDir) {
      return promisifyVinyl(
        src(tmpDir + '/**')
          .pipe(zip(options.archiveName + '-' + version + '.zip'))
          .pipe(dest('archives'))
      )
    })
  }
  
  
  function writeArchiveFiles(options) {
    let tmpDir = path.join('tmp/archives', options.archiveName)
  
    let writingPkgs = promisifyVinyl(
      src([
        '*.+(js|css)',
        'locales/*.js'
      ], {
        cwd: options.bundleDir,
        base: options.bundleDir
      }).pipe(
        dest(path.join(tmpDir, 'lib'))
      )
    )
  
    let writingOtherExampleFiles = promisifyVinyl(
      src(options.exampleOtherFiles, { cwd: 'examples', base: '.' })
        .pipe(dest(tmpDir))
    )
  
    let writingTopLevelFiles = promisifyVinyl(
      src(options.topLevelFiles)
        .pipe(dest(tmpDir))
    )
  
    return Promise.all([
      writingPkgs,
      writeExampleHtmlAndVendor(options.exampleHtmlFiles, tmpDir),
      writingOtherExampleFiles,
      writingTopLevelFiles
    ]).then(function() {
      return tmpDir
    })
  }
  
  
  function writeExampleHtmlAndVendor(exampleHtmlFiles, tmpDir) {
    let vendorPaths = []
  
    let writingExampleHtmlFiles = promisifyVinyl(
      src(exampleHtmlFiles, { cwd: 'examples', base: '.' })
        .pipe(modify(replaceContent))
        .pipe(dest(tmpDir))
    )
  
    function replaceContent(content) {
      return content.replace(
        /((?:src|href)=['"])([^'"]*)(['"])/g,
        function(m0, m1, m2, m3) {
          return m1 + transformResourcePath(m2) + m3
        }
      )
    }
  
    function transformResourcePath(resourcePath) {
  
      resourcePath = resourcePath.replace(
        /^\.\.\/packages(-premium)?\/bundle\b/,
        '../lib'
      )
  
      resourcePath = resourcePath.replace(
        /^\.\.\/(node_modules\/.*\/([^/]+))$/,
        function(m0, m1, m2) {
          vendorPaths.push(m1) // the path on the filesystem from proj root
          return '../vendor/' + m2 // how the html file will reference it
        }
      )
  
      return resourcePath
    }
  
    return writingExampleHtmlFiles.then(function() {
      if (vendorPaths.length) {
        return promisifyVinyl(
          src(vendorPaths)
            .pipe(dest(tmpDir + '/vendor'))
        )
      }
    })
  }
  