/* eslint-disable
    handle-callback-err,
    no-return-assign,
    no-unused-vars,
    no-useless-escape,
*/
// TODO: This file was created by bulk-decaffeinate.
// Fix any style issues and re-enable lint.
/*
 * decaffeinate suggestions:
 * DS101: Remove unnecessary use of Array.from
 * DS102: Remove unnecessary code created because of implicit returns
 * DS103: Rewrite code to no longer use __guard__
 * DS207: Consider shorter variations of null checks
 * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
 */
let OutputFileFinder
const async = require('async')
const fs = require('fs')
const Path = require('path')
const { spawn } = require('child_process')
const logger = require('logger-sharelatex')

module.exports = OutputFileFinder = {
  findOutputFiles(resources, directory, callback) {
    if (callback == null) {
      callback = function(error, outputFiles, allFiles) {}
    }
    const incomingResources = {}
    for (const resource of Array.from(resources)) {
      incomingResources[resource.path] = true
    }

    return OutputFileFinder._getAllFiles(directory, function(error, allFiles) {
      if (allFiles == null) {
        allFiles = []
      }
      if (error != null) {
        logger.err({ err: error }, 'error finding all output files')
        return callback(error)
      }
      const outputFiles = []
      for (const file of Array.from(allFiles)) {
        if (!incomingResources[file]) {
          outputFiles.push({
            path: file,
            type: __guard__(file.match(/\.([^\.]+)$/), x => x[1])
          })
        }
      }
      return callback(null, outputFiles, allFiles)
    })
  },

  _getAllFiles(directory, _callback) {
    if (_callback == null) {
      _callback = function(error, fileList) {}
    }
    const callback = function(error, fileList) {
      _callback(error, fileList)
      return (_callback = function() {})
    }

    // don't include clsi-specific files/directories in the output list
    const EXCLUDE_DIRS = [
      '-name',
      '.cache',
      '-o',
      '-name',
      '.archive',
      '-o',
      '-name',
      '.project-*'
    ]
    const args = [
      directory,
      '(',
      ...Array.from(EXCLUDE_DIRS),
      ')',
      '-prune',
      '-o',
      '-type',
      'f',
      '-print'
    ]
    logger.log({ args }, 'running find command')

    const proc = spawn('find', args)
    let stdout = ''
    proc.stdout.on('data', chunk => (stdout += chunk.toString()))
    proc.on('error', callback)
    return proc.on('close', function(code) {
      if (code !== 0) {
        logger.warn(
          { directory, code },
          "find returned error, directory likely doesn't exist"
        )
        return callback(null, [])
      }
      let fileList = stdout.trim().split('\n')
      fileList = fileList.map(function(file) {
        // Strip leading directory
        let path
        return (path = Path.relative(directory, file))
      })
      return callback(null, fileList)
    })
  }
}

function __guard__(value, transform) {
  return typeof value !== 'undefined' && value !== null
    ? transform(value)
    : undefined
}