'use strict';

//
// My Secure Server
//
//var greenlock = require('greenlock-express')
var greenlock = require('../').create({

  // Let's Encrypt v2 is ACME draft 11
  // Note: If at first you don't succeed, stop and switch to staging
  // https://acme-staging-v02.api.letsencrypt.org/directory
  server: 'https://acme-v02.api.letsencrypt.org/directory',
  version: 'draft-11'
    // You MUST have write access to save certs
    ,
  configDir: '~/.config/acme/'

    // The previous 'simple' example set these values statically,
    // but this example uses approveDomains() to set them dynamically
    //, email: 'none@see.note.above'
    //, agreeTos: false

    // approveDomains is the right place to check a database for
    // email addresses with domains and agreements and such
    ,
  approveDomains: approveDomains

    ,
  app: require('./my-express-app.js')

    // Get notified of important updates and help me make greenlock better
    ,
  communityMember: true

  //, debug: true

});

var server = greenlock.listen(80, 443);


//
// My Secure Database Check
//
function approveDomains(opts, certs, cb) {

  // Only one domain is listed with *automatic* registration via SNI
  // (it's an array because managed registration allows for multiple domains,
  //                                which was the case in the simple example)
  console.log(opts.domains);

  // The domains being approved for the first time are listed in opts.domains
  // Certs being renewed are listed in certs.altnames
  if (certs) {
    opts.domains = [certs.subject].concat(certs.altnames);
  }

  fooCheckDb(opts.domains, function (err, agree, email) {
    if (err) {
      cb(err);
      return;
    }

    // Services SHOULD automatically accept the ToS and use YOUR email
    // Clients MUST NOT accept the ToS without asking the user
    opts.agreeTos = agree;
    opts.email = email;

    // NOTE: you can also change other options such as `challengeType` and `challenge`
    // (this would be helpful if you decided you wanted wildcard support as a domain altname)
    // opts.challengeType = 'http-01';
    // opts.challenge = require('le-challenge-fs').create({});

    cb(null, {
      options: opts,
      certs: certs
    });
  });
}


//
// My User / Domain Database
//
function fooCheckDb(domains, cb) {
  // This is an oversimplified example of how we might implement a check in
  // our database if we have different rules for different users and domains
  var domains = ['example.com', 'www.example.com'];
  var userEmail = 'john.doe@example.com';
  var userAgrees = true;
  var passCheck = opts.domains.every(function (domain) {
    return -1 !== domains.indexOf(domain);
  });

  if (!passCheck) {
    cb(new Error('domain not allowed'));
  } else {
    cb(null, userAgrees, userEmail);
  }
}