const twilio = require('twilio')
const _ = require('lodash/fp')

const NAME = 'Twilio'

const BAD_NUMBER_CODES = [
  21201, 21202, 21211, 21214, 21216, 21217, 21219, 21408, 21610, 21612, 21614,
  21608,
]

function sendMessage(account, rec) {
  return Promise.resolve()
    .then(() => {
      // to catch configuration errors like
      // "Error: username is required"
      const client = twilio(account.accountSid, account.authToken)
      const body = rec.sms.body
      const _toNumber = rec.sms.toNumber || account.toNumber
      const from =
        _.startsWith('+')(account.fromNumber) ||
        !_.isNumber(String(account.fromNumber).replace(/\s/g, ''))
          ? account.fromNumber
          : `+${account.fromNumber}`

      const opts = {
        body: body,
        to: _toNumber,
        from,
      }

      return client.messages.create(opts)
    })
    .catch(err => {
      if (_.includes(err.code, BAD_NUMBER_CODES)) {
        const badNumberError = new Error(err.message)
        badNumberError.name = 'BadNumberError'
        throw badNumberError
      }

      throw new Error(`Twilio error: ${err.message}`)
    })
}

module.exports = {
  NAME,
  sendMessage,
}
