#!/usr/bin/env node

const fs = require('fs')
const app = require('../app')
const http = require('http')
const https = require('https')

function setupHTTPS () {
  const certificate = fs.readFileSync('/etc/letsencrypt/live/rooster.hetmml.nl/fullchain.pem', 'utf8')
  const privateKey = fs.readFileSync('/etc/letsencrypt/live/rooster.hetmml.nl/privkey.pem', 'utf8')
  const credentials = { key: privateKey, cert: certificate }

  const httpsPort = normalizePort(process.env.PORT_HTTPS || '3001')
  const httpsServer = https.createServer(credentials, app)

  httpsServer.listen(httpsPort)
  httpsServer.on('error', error => onError(error, httpsPort))
  httpsServer.on('listening', _ => onListening(httpsServer))

  app.set('port', httpsPort)
}

function setupHTTPSRedirect () {
  const httpPort = normalizePort(process.env.PORT || '3000')
  const httpServer = http.createServer(redirectToHTTPS)

  httpServer.listen(httpPort)
  httpServer.on('error', error => onError(error, httpPort))
  httpServer.on('listening', _ => onListening(httpServer))
}

function setupHTTP () {
  const httpPort = normalizePort(process.env.PORT || '3000')
  const httpServer = http.createServer(app)

  httpServer.listen(httpPort)
  httpServer.on('error', error => onError(error, httpPort))
  httpServer.on('listening', _ => onListening(httpServer))
}

function normalizePort (val) {
  const port = parseInt(val, 10)

  if (isNaN(port)) {
    // named pipe
    return val
  }

  if (port >= 0) {
    // port number
    return port
  }

  return false
}

function onError (error, port) {
  if (error.syscall !== 'listen') {
    throw error
  }

  const bind = typeof port === 'string'
    ? 'Pipe ' + port
    : 'Port ' + port

  // handle specific listen errors with friendly messages
  switch (error.code) {
    case 'EACCES':
      console.error(bind + ' requires elevated privileges')
      process.exit(1)
      break
    case 'EADDRINUSE':
      console.error(bind + ' is already in use')
      process.exit(1)
      break
    default:
      throw error
  }
}

function onListening (server) {
  const addr = server.address()
  const bind = typeof addr === 'string'
    ? 'pipe ' + addr
    : 'port ' + addr.port
  console.log('Listening on ' + bind)
}

let useHTTPS = true
try {
  fs.accessSync('/etc/letsencrypt/live/rooster.hetmml.nl/privkey.pem')
} catch (e) {
  useHTTPS = false
}

if (useHTTPS) {
  try {
    setupHTTPS()
    setupHTTPSRedirect()
  } catch (e) {
    console.warn('NOT USING HTTPS! Error occured while setting up HTTPS')
    setupHTTP()
  }
} else {
  console.warn('NOT USING HTTPS! Could not read /etc/letsencrypt/live/rooster.hetmml.nl/privkey.pem')
  setupHTTP()
}

function redirectToHTTPS (req, res) {
  res.writeHead(302, { 'Location': 'https://' + req.headers['host'] + req.url })
  res.end()
}