// 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 */

var ACME2 = require('./').ACME;

function resolveFn(cb) {
  return function (val) {
    // nextTick to get out of Promise chain
    process.nextTick(function () { cb(null, val); });
  };
}
function rejectFn(cb) {
  return function (err) {
    console.error('[acme-v2] handled(?) rejection as errback:');
    console.error(err.stack);

    // nextTick to get out of Promise chain
    process.nextTick(function () { cb(err); });

    // do not resolve promise further
    return new Promise(function () {});
  };
}

function create(deps) {
  deps.LeCore = {};
  var acme2 = ACME2.create(deps);
  acme2.registerNewAccount = function (options, cb) {
    acme2.accounts.create(options).then(resolveFn(cb), rejectFn(cb));
  };
  acme2.getCertificate = function (options, cb) {
    options.agreeToTerms = options.agreeToTerms || function (tos) {
      return Promise.resolve(tos);
    };
    acme2.certificates.create(options).then(function (certs) {
      var privkeyPem = acme2.RSA.exportPrivatePem(options.domainKeypair);
      certs.privkey = privkeyPem;
      resolveFn(cb)(certs);
    }, rejectFn(cb));
  };
  acme2.getAcmeUrls = function (options, cb) {
    acme2.init(options).then(resolveFn(cb), rejectFn(cb));
  };
  acme2.getOptions = function () {
    var defs = {};

    Object.keys(module.exports.defaults).forEach(function (key) {
      defs[key] = defs[deps] || module.exports.defaults[key];
    });

    return defs;
  };
  acme2.stagingServerUrl = module.exports.defaults.stagingServerUrl;
  acme2.productionServerUrl = module.exports.defaults.productionServerUrl;
  acme2.acmeChallengePrefix = module.exports.defaults.acmeChallengePrefix;
  return acme2;
}

module.exports.ACME = { };
module.exports.defaults = {
  productionServerUrl:    'https://acme-v02.api.letsencrypt.org/directory'
, stagingServerUrl:       'https://acme-staging-v02.api.letsencrypt.org/directory'
, knownEndpoints:         [ 'keyChange', 'meta', 'newAccount', 'newNonce', 'newOrder', 'revokeCert' ]
, challengeTypes:         [ 'http-01', 'dns-01' ]
, challengeType:          'http-01'
//, keyType:                'rsa' // ecdsa
//, keySize:                2048 // 256
, rsaKeySize:             2048 // 256
, acmeChallengePrefix:    '/.well-known/acme-challenge/'
};
Object.keys(module.exports.defaults).forEach(function (key) {
  module.exports.ACME[key] = module.exports.defaults[key];
});
Object.keys(ACME2).forEach(function (key) {
  module.exports.ACME[key] = ACME2[key];
});
module.exports.ACME.create = create;