#!/usr/bin/env node

'use strict'

const fs = require('fs')
const vm = require('vm')
const minimist = require('minimist')
const composer = require('../composer')

const argv = minimist(process.argv.slice(2), {
    string: ['apihost', 'auth', 'deploy', 'lower'],
    boolean: ['insecure', 'encode', 'json', 'version'],
    alias: { auth: 'u', insecure: 'i', version: 'v' }
})

if (argv.version) {
    console.log(composer.version)
    return
}

let count = 0
if (argv.json) count++
if (argv.encode) count++
if (typeof argv.deploy !== 'undefined') count++

if (argv._.length !== 1 || count > 1 || argv.deploy === '') {
    console.error('Usage:')
    console.error('  compose composition.js[on] command [flags]')
    console.error('Commands:')
    console.error('  --json                 output the json representation for the composition (default command)')
    console.error('  --deploy NAME          deploy the composition with name NAME')
    console.error('  --encode               output the conductor action code for the composition')
    console.error('Flags:')
    console.error('  --lower [VERSION]      lower to primitive combinators or specific composer version')
    console.error('  --apihost HOST         API HOST')
    console.error('  -u, --auth KEY         authorization KEY')
    console.error('  -i, --insecure         bypass certificate checking')
    console.error('  -v, --version          output the composer version')
    return
}

const filename = argv._[0]
const source = fs.readFileSync(filename, { encoding: 'utf8' })
let composition = filename.slice(filename.lastIndexOf('.')) === '.js' ? vm.runInNewContext(source, { composer, require, console, process }) : composer.deserialize(JSON.parse(source))
const lower = typeof argv.lower === 'string' ? argv.lower : false
if (argv.deploy) {
    const options = { ignore_certs: argv.insecure }
    if (argv.apihost) options.apihost = argv.apihost
    if (argv.auth) options.api_key = argv.auth
    composer.openwhisk(options).compositions.deploy(composer.composition(argv.deploy, composition), lower)
        .then(obj => {
            const names = obj.actions.map(action => action.name)
            console.log(`ok: created action${names.length > 1 ? 's' : ''} ${names}`)
        }, console.error)
} else if (argv.encode) {
    console.log(composer.encode(composer.composition('anonymous', composition), lower).actions.slice(-1)[0].action.exec.code)
} else {
    console.log(JSON.stringify(composer.lower(composition, lower), null, 4))
}
