// Copyright 2018 AJ ONeal. All rights reserved
/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
'use strict';

/* global Promise */
module.exports.run = function run(directoryUrl, RSA, web, chType, email, accountKeypair, domainKeypair) {
  var acme2 = require('../').ACME.create({ RSA: RSA });
  // [ 'test.ppl.family' ] 'coolaj86@gmail.com''http-01'
  acme2.init(directoryUrl).then(function () {
    var options = {
      agreeToTerms: function (tosUrl) {
        return Promise.resolve(tosUrl);
      }
    , setChallenge: function (opts) {
        return new Promise(function (resolve, reject) {
          var pathname;

          console.log("");
          console.log('identifier:');
          console.log(opts.identifier);
          console.log('hostname:');
          console.log(opts.hostname);
          console.log('type:');
          console.log(opts.type);
          console.log('token:');
          console.log(opts.token);
          console.log('thumbprint:');
          console.log(opts.thumbprint);
          console.log('keyAuthorization:');
          console.log(opts.keyAuthorization);
          console.log('dnsAuthorization:');
          console.log(opts.dnsAuthorization);
          console.log("");

          if ('http-01' === opts.type) {
            pathname = opts.hostname + acme2.challengePrefixes['http-01'] + "/" + opts.token;
            console.log("Put the string '" + opts.keyAuthorization + "' into a file at '" + pathname + "'");
            console.log("echo '" + opts.keyAuthorization + "' > '" + pathname + "'");
          } else if ('dns-01' === opts.type) {
            pathname = acme2.challengePrefixes['dns-01'] + "." + opts.hostname.replace(/^\*\./, '');
            console.log("Put the string '" + opts.dnsAuthorization + "' into the TXT record '" + pathname + "'");
            console.log("dig TXT " + pathname + " '" + opts.dnsAuthorization + "'");
          } else {
            reject(new Error("[acme-v2] unrecognized challenge type"));
            return;
          }
          console.log("\nThen hit the 'any' key to continue...");

          function onAny() {
            console.log("'any' key was hit");
            process.stdin.pause();
            process.stdin.removeListener('data', onAny);
            process.stdin.setRawMode(false);
            resolve();
            return;
          }

          process.stdin.setRawMode(true);
          process.stdin.resume();
          process.stdin.on('data', onAny);
        });
      }
    , removeChallenge: function (opts) {
        console.log('[acme-v2] remove challenge', opts.hostname, opts.keyAuthorization);
        return new Promise(function (resolve) {
          // hostname, key
          setTimeout(resolve, 1 * 1000);
        });
      }
    , challengeType: chType
    , email: email
    , accountKeypair: accountKeypair
    , domainKeypair: domainKeypair
    , domains: web
    };

    acme2.accounts.create(options).then(function (account) {
      console.log('[acme-v2] account:');
      console.log(account);

      acme2.certificates.create(options).then(function (fullchainPem) {
        console.log('[acme-v2] fullchain.pem:');
        console.log(fullchainPem);
      });
    });
  });
};