'use strict';

var fs = require('fs');
var crypto = require('crypto');
var ursa = require('ursa');

// Here are all the places you can discover the account id:
//
// letsencrypt/account.py
//
// /etc/letsencrypt/accounts/{{ server }}/directory/{{ accountId }}/private_key.json
// /etc/letsencrypt/accounts/acme-v01.api.letsencrypt.org/directory/f4c33502df3789849f617944253b35ae/private_key.json
//
// /etc/letsencrypt/renewal/{{ hostname }}.conf
// /etc/letsencrypt/renewal/example.com.conf
//
// Note: each domain has its own private key

function fromPrivateKeyUrsa(priv, cb) {
  var pub = priv.toPublicPem();
  var accountId = crypto.createHash('md5').update(pub).digest('hex');

  cb(null, accountId);
}

function fromAccountPrivateKey(pkj, cb) {
  Object.keys(pkj).forEach(function (key) {
    pkj[key] = new Buffer(pkj[key], 'base64');
  });

  var priv = ursa.createPrivateKeyFromComponents(
    pkj.n // modulus
  , pkj.e // exponent
  , pkj.p
  , pkj.q
  , pkj.dp
  , pkj.dq
  , pkj.qi
  , pkj.d
  );

  fromPrivateKeyUrsa(priv, cb);
}

function fromAccountPrivateKeyFile(privateKeyPath, cb) {
  // Read ACME account key
  fs.readFile(privateKeyPath, 'utf8', function (err, privkeyJson) {
    var pkj;

    if (err) {
      cb(err);
      return;
    }

    try {
      pkj = JSON.parse(privkeyJson);
    } catch(e) {
      cb(e);
      return;
    }

    fromAccountPrivateKey(pkj, cb);
  });
}

function bogusAccountId(cb) {
  var priv = ursa.generatePrivateKey(2048, 65537);

  fromPrivateKeyUrsa(priv, cb);
}

module.exports.bogusAccountId = bogusAccountId;
module.exports.fromAccountPrivateKey = fromAccountPrivateKey;

module.exports.bogusAccountId(function (err, id) {
  console.log('Random Account Id', id);
});
module.exports.fromAccountPrivateKey('/etc/letsencrypt/live/example.com/privkey.pem', function (err, id) {
  console.log(id);
});