#!/usr/bin/env node
'use strict'

const mri = require('mri')

const argv = mri(process.argv.slice(2), {
	boolean: [
		'help', 'h',
		'silent', 's',
	]
})

if (argv.help || argv.h) {
	process.stdout.write(`
Usage:
    highest-endpoint-version <profile>
Options:
    --silent  -s  Output just the version instead of a pretty
                  represenation.
Examples:
    highest-endpoint-version oebb
\n`)
	process.exit(0)
}

const {join} = require('path')
const createClient = require('../..')

const profile = require(join(__dirname, '..', '..', 'p', argv._[0]))
const id = (ctx, val) => val
const origTransformReqBody = profile.transformReqBody || id

const checkWithVersion = async (version) => {
	const transformReqBody = (ctx, body) => {
		body = origTransformReqBody(ctx, body)
		return {...body, ver: version}
	}
	const client = createClient({
		...profile, transformReqBody
	}, 'hafas-client-highest-endpoint-version')

	try {
		await client.locations('foo', {results: 1})
	} catch (err) {
		if (err && err.code === 'VERSION') return false
		const wrapped = new Error(`check for ${version} support failed with an unknown error`)
		wrapped.originalError = err
		throw wrapped
	}
	return true
}

const silent = argv.silent || argv.s

;(async () => {
	const parseVer = ver => parseInt(ver.split('.')[1])
	let baseMinor = 16
	if ('string' === typeof profile.ver && profile.ver) {
		baseMinor = parseVer(profile.ver)
	} else {
		const ctx = {opt: {}}
		const body = profile.transformReqBody(ctx, {})
		if ('string' === typeof body.ver && body.ver) {
			baseMinor = parseVer(body.ver)
		}
	}

	for (let minor = baseMinor; minor <= 70; minor++) {
		const v = '1.' + minor
		if (await checkWithVersion(v)) {
			if (!silent) console.log(v + ' is supported ✔︎')
		} else {
			if (silent) console.log(v)
			else console.log(v + ' is not supported ✘')
			process.exit(0)
		}
	}
	process.exit(1)
})()
.catch((err) => {
	console.error(err)
	process.exit(1)
})
