/* ----------------------------------------------------------------------------

 Question Server
 GitLab: <https://gitlab.com/MrFry/question-node-server>

 This program is free software: you can redistribute it and/or modify
 it under the terms of the GNU General Public License as published by
 the Free Software Foundation, either version 3 of the License, or
 (at your option) any later version.

 This program is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 GNU General Public License for more details.

 You should have received a copy of the GNU General Public License
 along with this program. If not, see <https://www.gnu.org/licenses/>.

 ------------------------------------------------------------------------- */

const startHTTPS = true
const port = 8080
const httpsport = 8443

const express = require('express')
const vhost = require('vhost')
const logger = require('./utils/logger.js')
const utils = require('./utils/utils.js')
const fs = require('fs')
const http = require('http')
const https = require('https')
const stat = require('./utils/stat.js')
stat.Load()

const qmining = require('./modules/qmining.js').app
const main = require('./modules/main.js').app
const sio = require('./modules/sio.js').app
const stuff = require('./modules/stuff.js').app
const old = require('./modules/old.js').app

const locLogFile = './stats/logs'
const allLogFile = '/nlogs/log'

// https://certbot.eff.org/
const privkeyFile = '/etc/letsencrypt/live/frylabs.net/privkey.pem'
const fullchainFile = '/etc/letsencrypt/live/frylabs.net/fullchain.pem'
const chainFile = '/etc/letsencrypt/live/frylabs.net/chain.pem'

var certsLoaded = false
if (startHTTPS && utils.FileExists(privkeyFile) && utils.FileExists(fullchainFile) && utils.FileExists(
  chainFile)) {
  try {
    const key = fs.readFileSync(privkeyFile, 'utf8')
    const cert = fs.readFileSync(fullchainFile, 'utf8')
    const ca = fs.readFileSync(chainFile, 'utf8')
    var certs = {
      key: key,
      cert: cert,
      ca: ca
    }
    certsLoaded = true
  } catch (e) {
    logger.Log('Error loading cert files!', logger.GetColor('redbg'))
    console.log(e)
  }
}

function setLogTimer () {
  const d = new Date()
  const h = new Date(
    d.getFullYear(),
    d.getMonth(),
    d.getDate() + 1,
    0,
    0,
    0,
    0
  )
  const e = h - d

  if (e > 100) {
    setTimeout(setLogTimer, e)
  } else {
    logger.Log('Log timer malfunction :/')
  }

  const line = '-------------------------------------------------------------------------------'

  logger.Log(line)
  utils.AppendToFile(line, locLogFile)
  utils.AppendToFile(line, allLogFile)
}

setLogTimer()

const app = express()

const loggableKeywords = [
  'user.js'
]

app.use(function (req, res, next) {
  res.on('finish', function () {
    logger.LogReq(req, true, res.statusCode)
    let toLog = loggableKeywords.some((x) => {
      return req.url.includes(x)
    })
    if (toLog) { logger.LogReq(req) }
    if (res.statusCode !== 404) { stat.LogStat(req.url) }
  })
  next()
})

app.use(vhost('qmining.frylabs.net', qmining))
app.use(vhost('sio.frylabs.net', sio))
app.use(vhost('stuff.frylabs.net', stuff))
app.use(vhost('frylabs.net', main))
app.use(vhost('www.frylabs.net', main))

app.use(vhost('qmining.tk', old))
app.use(vhost('www.qmining.tk', old))

app.use(vhost('localhost', qmining))

logger.Log('Node version: ' + process.version)
logger.Log('Listening on port: ' + port)

const httpServer = http.createServer(app)
httpServer.listen(port)
if (certsLoaded) {
  const httpsServer = https.createServer(certs, app)
  httpsServer.listen(httpsport)
  logger.Log('Listening on port: ' + httpsport + ' (https)')
} else {
  logger.Log('Https not avaible')
}

// app.listen(port)