const _ = require('lodash/fp')
const utils = require('./utils')
const sms = require('../sms')

function printSmsAlerts(alertRec, config) {
  let alerts = []

  if (config.balance) {
    alerts = _.concat(alerts, alertRec.general)
  }

  _.forEach(device => {
    alerts = _.concat(alerts, utils.deviceAlerts(config, alertRec, device))
  }, _.keys(alertRec.devices))

  if (alerts.length === 0) return null

  const alertsMap = _.groupBy('code', alerts)

  const alertTypes = _.map(entry => {
    const code = entry[0]
    const machineNames = _.filter(
      _.negate(_.isEmpty),
      _.map('machineName', entry[1]),
    )

    const cryptoCodes = _.filter(
      _.negate(_.isEmpty),
      _.map('cryptoCode', entry[1]),
    )

    return {
      codeDisplay: utils.codeDisplay(code),
      machineNames,
      cryptoCodes,
    }
  }, _.toPairs(alertsMap))

  const mapByCodeDisplay = _.map(it => {
    if (_.isEmpty(it.machineNames) && _.isEmpty(it.cryptoCodes))
      return it.codeDisplay
    if (_.isEmpty(it.machineNames))
      return `${it.codeDisplay} (${it.cryptoCodes.join(', ')})`
    return `${it.codeDisplay} (${it.machineNames.join(', ')})`
  })

  const displayAlertTypes = _.compose(
    _.uniq,
    mapByCodeDisplay,
    _.sortBy('codeDisplay'),
  )(alertTypes)

  return '[Lamassu] Errors reported: ' + displayAlertTypes.join(', ')
}

const sendMessage = sms.sendMessage

module.exports = { printSmsAlerts, sendMessage }
