#!/usr/bin/env node

import { version } from '../package.json'
import { MkdirpOptions } from './opts-arg.js'

const usage = () => `
usage: mkdirp [DIR1,DIR2..] {OPTIONS}

  Create each supplied directory including any necessary parent directories
  that don't yet exist.

  If the directory already exists, do nothing.

OPTIONS are:

  -m<mode>       If a directory needs to be created, set the mode as an octal
  --mode=<mode>  permission string.

  -v --version   Print the mkdirp version number

  -h --help      Print this helpful banner

  -p --print     Print the first directories created for each path provided

  --manual       Use manual implementation, even if native is available
`

const dirs: string[] = []
const opts: MkdirpOptions = {}
let doPrint: boolean = false
let dashdash = false
let manual = false
for (const arg of process.argv.slice(2)) {
  if (dashdash) dirs.push(arg)
  else if (arg === '--') dashdash = true
  else if (arg === '--manual') manual = true
  else if (/^-h/.test(arg) || /^--help/.test(arg)) {
    console.log(usage())
    process.exit(0)
  } else if (arg === '-v' || arg === '--version') {
    console.log(version)
    process.exit(0)
  } else if (arg === '-p' || arg === '--print') {
    doPrint = true
  } else if (/^-m/.test(arg) || /^--mode=/.test(arg)) {
    // these don't get covered in CI, but work locally
    // weird because the tests below show as passing in the output.
    /* c8 ignore start */
    const mode = parseInt(arg.replace(/^(-m|--mode=)/, ''), 8)
    if (isNaN(mode)) {
      console.error(`invalid mode argument: ${arg}\nMust be an octal number.`)
      process.exit(1)
    }
    /* c8 ignore stop */
    opts.mode = mode
  } else dirs.push(arg)
}

import { mkdirp } from './index.js'
const impl = manual ? mkdirp.manual : mkdirp
if (dirs.length === 0) {
  console.error(usage())
}

// these don't get covered in CI, but work locally
/* c8 ignore start */
Promise.all(dirs.map(dir => impl(dir, opts)))
  .then(made => (doPrint ? made.forEach(m => m && console.log(m)) : null))
  .catch(er => {
    console.error(er.message)
    if (er.code) console.error('  code: ' + er.code)
    process.exit(1)
  })
/* c8 ignore stop */
