logger = require "winston"
nodemailer = require "nodemailer"
request = require "request"
config = require "./config/config"
config.email = config.get('email')
config.nodemailer = config.get('nodemailer')
config.smsGateway = config.get('smsGateway')

exports.sendEmail = (contactAddress, title, messagePlain, messageHTML, callback) ->

  nodemailerConfig = null
  fromAddress = null

  if config.email
    nodemailerConfig = config.email.nodemailer
    fromAddress = config.email.fromAddress
  else if config.nodemailer
    # Support old config format for backwards compatibility
    nodemailerConfig = config.nodemailer
    fromAddress = nodemailerConfig.auth.user
  else
    return callback new Error "No email config found"

  logger.info "Sending email to '#{contactAddress}' using service " +
    "#{nodemailerConfig.service} - #{fromAddress}"
  smtpTransport = nodemailer.createTransport nodemailerConfig

  smtpTransport.sendMail {
    from: fromAddress
    to: contactAddress
    subject: title
    text: messagePlain
    html: messageHTML
  }, (error, response) ->
    callback error ? null

sendSMS = (contactAddress, message, callback) ->
  if config.smsGateway.provider is 'clickatell'
    sendSMS_Clickatell contactAddress, message, callback
  else
    callback "Unknown SMS gateway provider '#{config.smsGateway.provider}'"

sendSMS_Clickatell = (contactAddress, message, callback) ->
  logger.info "Sending SMS to '#{contactAddress}' using Clickatell"
  request "http://api.clickatell.com/http/sendmsg?api_id=#{config.smsGateway.config.apiID}&" +
      "user=#{config.smsGateway.config.user}&password=#{config.smsGateway.config.pass}&" +
      "to=#{contactAddress}&text=#{escapeSpaces message}", (err, response, body) ->
    logger.info "Received response from Clickatell: #{body}" if body?
    callback err ? null


escapeSpaces = (str) -> str.replace ' ', '+'

###
# Send a message to a user using a specific method. Current supported methods are 'email' and 'sms'.
# contactAddress should contain an email address if the method is 'email' and an MSISDN if the method is 'sms'.
#
# The contents of the message should be passed via messagePlain.
# messageHTML is optional and is only used by the 'email' method.
###
exports.contactUser = contactUser = (method, contactAddress, title, messagePlain, messageHTML, callback) ->
  if method is 'email'
    exports.sendEmail contactAddress, title, messagePlain, messageHTML, callback
  else if method is 'sms'
    sendSMS contactAddress, messagePlain, callback
  else
    callback "Unknown contact method '#{method}'"
