import express from 'express'
const nodemailer = require('nodemailer')
const validator = require('validator')
const xssFilters = require('xss-filters')

const app = express()
app.use(express.json())

app.post('/', function (req, res) {
  const attributes = ['name', 'email', 'msg']
  const sanitizedAttributes = attributes.map(n => validateAndSanitize(n, req.body[n]))
  const someInvalid = sanitizedAttributes.some(r => !r)

  if (someInvalid) {
    return res.status(400).json({ 'error': 'bad request'})
  }

  sendMail(...sanitizedAttributes)
  return res.status(200).json({ 'message': 'success'})
})

export default {
  path: '/api/contact',
  handler: app,
}

function validateAndSanitize (key, value) {
  const rejectFunctions = {
    name: v => v.length < 4,
    email: v => !validator.isEmail(v),
    msg: v => v.length < 1,
  }

  if (value === undefined || value.length < 1) { return false }

  // if object has key and function returns false, return sanitised input.
  // Else, return false
  return rejectFunctions.hasOwnProperty(key) && !rejectFunctions[key](value) && xssFilters.inHTMLData(value)
}

function sendMail (name, email, msg) {
  const transporter = nodemailer.createTransport({
    sendmail: true,
    newline: 'unix',
    path: '/usr/sbin/sendmail'
  })

  const text =
`Message from ${name}:

${msg}`

  const mailJson = {
    from: 'server@gabbaell.co.uk',
    replyTo: email,
    to: 'leopold@rayelliott.dev',
    subject: 'Contact form message concerning Marc Leopold',
    text: text,
  }

  transporter.sendMail(mailJson)
}