#!/usr/bin/env node

/**
 * Command line interface of {{signature.name}}.
 * This file is auto generated by ape-tmpl.
 */

'use strict'

const program = require('commander')
const pkg = require('../package')
const {{camelcase signature.name}} = require('{{{lib}}}')

program
  .version(pkg[ 'version' ])
{{#if signature.main}}
  .usage('[options] {{#each signature.args}}{{#if optional}}[{{name}}{{#if multiple}}...{{/if}}]{{else}}<{{name}}{{#if multiple}} ...{{/if}}>{{/if}} {{/each}}')
{{/if}}
  .description({{#if signature.desc}}'{{{signature.desc}}}'{{else}}pkg[ 'description' ]{{/if}})
{{#each signature.options}}  .option('-{{short}}, --{{name}}{{#if type}} {{#if optional}}[{{name}}]{{else}}<{{name}}>{{/if}}{{/if}}', '{{{desc}}}')
{{/each}}
{{#each signature.commands}}

// Handling `{{name}}` command
program
  .command('{{name}}{{#each args}} {{#if optional}}[{{name}}{{#if multiple}}...{{/if}}]{{else}}<{{name}}{{#if multiple}} ...{{/if}}>{{/if}}{{/each}}'){{#if alias}}
  .alias('{{alias}}')
{{/if}}

  .description('{{{desc}}}')
{{#each options}}  .option('-{{short}}, --{{name}}{{#if type}} {{#if optional}}[{{name}}]{{else}}<{{name}}>{{/if}}{{/if}}', '{{{desc}}}')
{{/each}}
  .action(({{#each args}}{{name}}, {{/each}}options) =>
    {{camelcase ../signature.name}}.{{camelcase name}}({{#each args}}{{name}}, {{/each}}options).catch(handleError)
  )
{{/each}}
{{#if signature.examples}}

// Show examples
program.on('--help', () => {
  console.log('  Examples:')
  console.log('')
{{#each signature.examples}}  console.log('  $ {{{script}}} {{#if desc}}  # {{{desc}}}{{/if}}')
{{/each}}
  console.log('')
})

{{/if}}
program.parse(process.argv)
{{#if signature.main}}

// Run main command
{{camelcase signature.name}}.apply({{camelcase signature.name}}, program.args.concat({
{{#each signature.options}}  {{name}}: program.{{name}}{{#if @last}}{{else}},
{{/if}}
{{/each}}
})
).catch(handleError)
{{else}}

// Check sub command
{
  let command = process.argv[2]
  if (!command) {
    program.outputHelp()
    return
  }

  let _isValid = name => {
    for (let command of program.commands) {
      let hit = (command.name() === name) || (command.alias() === name)
      if (hit) {
        return true
      }
    }
    return false
  }
  if (!_isValid(command)) {
    console.log("[{{signature.name}}] '%s' is not an {{signature.name}} command. See '{{signature.name}} --help'.", command)
  }

}
{{/if}}

// Handlers

/** Handle error */
function handleError (err) {
  console.error(err)
  process.exit(1)
}
