/* eslint-disable
    handle-callback-err,
    no-unused-vars,
*/
// 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
 * DS207: Consider shorter variations of null checks
 * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
 */
let TikzManager
const fs = require('fs')
const Path = require('path')
const ResourceWriter = require('./ResourceWriter')
const SafeReader = require('./SafeReader')
const logger = require('logger-sharelatex')

// for \tikzexternalize or pstool to work the main file needs to match the
// jobname.  Since we set the -jobname to output, we have to create a
// copy of the main file as 'output.tex'.

module.exports = TikzManager = {
  checkMainFile(compileDir, mainFile, resources, callback) {
    // if there's already an output.tex file, we don't want to touch it
    if (callback == null) {
      callback = function (error, needsMainFile) {}
    }
    for (const resource of Array.from(resources)) {
      if (resource.path === 'output.tex') {
        logger.log({ compileDir, mainFile }, 'output.tex already in resources')
        return callback(null, false)
      }
    }
    // if there's no output.tex, see if we are using tikz/pgf or pstool in the main file
    return ResourceWriter.checkPath(compileDir, mainFile, function (
      error,
      path
    ) {
      if (error != null) {
        return callback(error)
      }
      return SafeReader.readFile(path, 65536, 'utf8', function (
        error,
        content
      ) {
        if (error != null) {
          return callback(error)
        }
        const usesTikzExternalize =
          (content != null
            ? content.indexOf('\\tikzexternalize')
            : undefined) >= 0
        const usesPsTool =
          (content != null ? content.indexOf('{pstool}') : undefined) >= 0
        logger.log(
          { compileDir, mainFile, usesTikzExternalize, usesPsTool },
          'checked for packages needing main file as output.tex'
        )
        const needsMainFile = usesTikzExternalize || usesPsTool
        return callback(null, needsMainFile)
      })
    })
  },

  injectOutputFile(compileDir, mainFile, callback) {
    if (callback == null) {
      callback = function (error) {}
    }
    return ResourceWriter.checkPath(compileDir, mainFile, function (
      error,
      path
    ) {
      if (error != null) {
        return callback(error)
      }
      return fs.readFile(path, 'utf8', function (error, content) {
        if (error != null) {
          return callback(error)
        }
        logger.log(
          { compileDir, mainFile },
          'copied file to output.tex as project uses packages which require it'
        )
        // use wx flag to ensure that output file does not already exist
        return fs.writeFile(
          Path.join(compileDir, 'output.tex'),
          content,
          { flag: 'wx' },
          callback
        )
      })
    })
  }
}
