import pkg from '../package.json'
import { Command } from 'commander'

const program = new Command()

export default function () {
  //
  //= Process CLI input

  program
    .version(pkg.version)
    .usage('[options] [-c <config.yml> | <config.yml>]')
    .description(pkg.description)
    .option(
      '-q, --quiet',
      'Silence the output from the generator (default: false)'
    )
    .option(
      '-c, --config <file>',
      'Specify the config yaml. Will take precedence over passing via the first argument.'
    )

    .option(
      '-t, --target-dir <dir>',
      'the target build directory. Set to "null" to not write the output to the filesystem, making it only available via the API (default: public)',
      String
    )

    // This option specifies where the generated documentation HTML files will be output.
    .option(
      '-f, --target-file <file>',
      'the target build HTML file (default: index.html)',
      String
    )

    // This option lets you build a minimal version of the documentation without the HTML `<body>` tags, so you can embed
    // SpectaQL into your own website template.
    .option(
      '-e, --embeddable',
      'omit the HTML <body/> and generate the documentation content only (default: false)'
    )
    .option(
      '-1, --one-file',
      'Embed all resources (CSS and JS) into the same file (default: false)'
    )

    //**************************************
    //
    //  Theme Stuff
    //
    //
    .option(
      '-T, --theme-dir <path-or-theme-name>',
      'specify a path to a directory containing a theme to use. Or specify a built-in theme of "default", "basic" or "spectaql" (default: "default")',
      String
    )
    //
    //
    //**************************************

    //**************************************
    //
    //  CSS Stuff
    //
    //
    .option('-C, --disable-css', 'omit CSS generation (default: false)')
    //
    //
    //**************************************

    //**************************************
    //
    //  JS Stuff
    //
    //
    .option('-J, --disable-js', 'omit JavaScript generation (default: false)')
    //
    //
    //**************************************

    .option(
      '--logo-file <file>',
      'specify a custom logo file (default: null)',
      String
    )
    .option(
      '--no-logo-file',
      'do not use a custom logo file, overriding what may be in the config'
    )

    .option(
      '--favicon-file <file>',
      'specify a custom favicon file (default: null)',
      String
    )
    .option(
      '--no-favicon-file',
      'do not use a custom favicon file, overriding what may be in the config'
    )

    .option(
      '--schema-file <file...>',
      'specify a file, files or glob to files that contain a GraphQL Schema Definitions written in SDL to be used instead of an Introspection Query call (default: none)'
    )
    .option(
      '--introspection-url <url>',
      'specify a URL for an Introspection Query(default: none)',
      String
    )
    .option(
      '--introspection-file <file>',
      'specify a file that contains an Introspection Query response (default: none)',
      String
    )
    .option(
      '--introspection-metadata-file <file>',
      'specify a file that contains metadata to be added to the Introspection Query response (default: none)',
      String
    )
    .option(
      '--dynamic-examples-processing-module <file>',
      'specify a JS module that will dynamically generate schema examples (default: none',
      String
    )

    .option(
      '-H, --headers <headers>',
      'specify arbitrary HTTP headers for the Introspection Query as a JSON string (default: none)',
      String
    )

    .option(
      '-d, --development-mode',
      'start HTTP server with the file watcher (default: false)'
    )
    .option(
      '-D, --development-mode-live',
      'start HTTP server with the file watcher and live reload (default: false)'
    )
    .option(
      '-s, --start-server',
      'start the HTTP server without any development features'
    )
    .option(
      '-p, --port <port>',
      'the port number for the HTTP server to listen on (default: 4400)',
      Number
    )
    .option(
      '-P, --port-live <port>',
      'the port number for the live reload to listen on (default: 4401)',
      Number
    )

    // This option overrides the default directory which contains all the Handlebars templates, SCSS, and JavaScript
    // source files. This option is useful if you've copied the contents of `app` to a remote location or a separate
    // repo and customized it. Probably not something you need to use if you have cloned/forked the repo and customized
    // it
    .option(
      '-a, --app-dir <dir>',
      'the application source directory (default: app)',
      String
    )
    .option(
      '-g, --grunt-config-file <file>',
      'specify a custom Grunt configuration file (default: dist/lib/gruntConfig.js)',
      String
    )
    .option(
      '-N, --noop',
      'This option does nothing, but may be useful in complex CLI scenarios to get argument parsing correct'
    )
    .parse(process.argv)

  const options = program.opts()

  if (options.config) {
    // config => specFile
    options.specFile = options.config
    delete options.config
  } else if (program.args.length >= 1) {
    options.specFile = program.args[0]
  } else {
    // Show help if no specfile or options are specified
    program.help()
  }

  return options
}