'use strict';

var ACME = require('../');
var accountKey = require('../fixtures/account.jwk.json').private;

var authorization = {
	identifier: {
		type: 'dns',
		value: 'example.com'
	},
	status: 'pending',
	expires: '2018-04-25T00:23:57Z',
	challenges: [
		{
			type: 'dns-01',
			status: 'pending',
			url:
				'https://acme-staging-v02.api.letsencrypt.org/acme/challenge/cMkwXI8pIeKN04Ynfem8ErHK3GeqAPdSt2x6q7PvVGU/118755342',
			token: 'LZdlUiZ-kWPs6q5WTmQFYQHZKpz9szn2vxEUu0XhyyM'
		},
		{
			type: 'http-01',
			status: 'pending',
			url:
				'https://acme-staging-v02.api.letsencrypt.org/acme/challenge/cMkwXI8pIeKN04Ynfem8ErHK3GeqAPdSt2x6q7PvVGU/118755343',
			token: '1S4zBG5YVhwSBaIY4ksI_KNMRrSmH0DZfNM9v7PYjDU'
		}
	]
};
var expectedChallengeUrl =
	'http://example.com/.well-known/acme-challenge/1S4zBG5YVhwSBaIY4ksI_KNMRrSmH0DZfNM9v7PYjDU';
var expectedKeyAuth =
	'1S4zBG5YVhwSBaIY4ksI_KNMRrSmH0DZfNM9v7PYjDU.UuuZa_56jCM2douUq1riGyRphPtRvCPkxtkg0bP-pNs';
var expectedKeyAuthDigest = 'iQiMcQUDiAeD0TJV1RHJuGnI5D2-PuSpxKz9JqUaZ2M';
var expectedDnsHost = '_test-challenge.example.com';

async function main() {
	console.info('\n[Test] computing challenge authorizatin responses');
	var challenges = authorization.challenges.slice(0);

	function next() {
		var ch = challenges.shift();
		if (!ch) {
			return null;
		}

		var hostname = authorization.identifier.value;
		return ACME.computeChallenge({
			accountKey: accountKey,
			hostname: hostname,
			challenge: ch,
			dnsPrefix: '_test-challenge'
		})
			.then(function(auth) {
				if ('dns-01' === ch.type) {
					if (auth.keyAuthorizationDigest !== expectedKeyAuthDigest) {
						console.error('[keyAuthorizationDigest]');
						console.error(auth.keyAuthorizationDigest);
						console.error(expectedKeyAuthDigest);
						throw new Error('bad keyAuthDigest');
					}
					if (auth.dnsHost !== expectedDnsHost) {
						console.error('[dnsHost]');
						console.error(auth.dnsHost);
						console.error(expectedDnsHost);
						throw new Error('bad dnsHost');
					}
				} else if ('http-01' === ch.type) {
					if (auth.challengeUrl !== expectedChallengeUrl) {
						console.error('[challengeUrl]');
						console.error(auth.challengeUrl);
						console.error(expectedChallengeUrl);
						throw new Error('bad challengeUrl');
					}
					if (auth.challengeUrl !== expectedChallengeUrl) {
						console.error('[keyAuthorization]');
						console.error(auth.keyAuthorization);
						console.error(expectedKeyAuth);
						throw new Error('bad keyAuth');
					}
				} else {
					throw new Error('bad authorization inputs');
				}
				console.info('PASS', hostname, ch.type);
				return next();
			})
			.catch(function(err) {
				err.message =
					'Error computing ' +
					ch.type +
					' for ' +
					hostname +
					':' +
					err.message;
				throw err;
			});
	}

	return next();
}

module.exports = function() {
	return main(authorization)
		.then(function() {
			console.info('PASS');
		})
		.catch(function(err) {
			console.error(err.stack);
			process.exit(1);
		});
};