/* eslint-disable
    camelcase,
*/
// TODO: This file was created by bulk-decaffeinate.
// Fix any style issues and re-enable lint.
/*
 * decaffeinate suggestions:
 * DS102: Remove unnecessary code created because of implicit returns
 * DS207: Consider shorter variations of null checks
 * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
 */
let HttpController
const ContactManager = require('./ContactManager')
const logger = require('@overleaf/logger')

module.exports = HttpController = {
  addContact(req, res, next) {
    const { user_id } = req.params
    const { contact_id } = req.body

    if (contact_id == null || contact_id === '') {
      res.status(400).send('contact_id should be a non-blank string')
      return
    }

    logger.debug({ user_id, contact_id }, 'adding contact')

    return ContactManager.touchContact(user_id, contact_id, function (error) {
      if (error != null) {
        return next(error)
      }
      return ContactManager.touchContact(contact_id, user_id, function (error) {
        if (error != null) {
          return next(error)
        }
        return res.sendStatus(204)
      })
    })
  },

  CONTACT_LIMIT: 50,
  getContacts(req, res, next) {
    let limit
    let { user_id } = req.params

    if ((req.query != null ? req.query.limit : undefined) != null) {
      limit = parseInt(req.query.limit, 10)
    } else {
      limit = HttpController.CONTACT_LIMIT
    }
    limit = Math.min(limit, HttpController.CONTACT_LIMIT)

    logger.debug({ user_id }, 'getting contacts')

    return ContactManager.getContacts(user_id, function (error, contact_dict) {
      if (error != null) {
        return next(error)
      }

      let contacts = []
      const object = contact_dict || {}
      for (user_id in object) {
        const data = object[user_id]
        contacts.push({
          user_id,
          n: data.n,
          ts: data.ts,
        })
      }

      HttpController._sortContacts(contacts)
      contacts = contacts.slice(0, limit)
      const contact_ids = contacts.map(contact => contact.user_id)

      return res.status(200).send({
        contact_ids,
      })
    })
  },

  _sortContacts(contacts) {
    return contacts.sort(function (a, b) {
      // Sort by decreasing count, descreasing timestamp.
      // I.e. biggest count, and most recent at front.
      if (a.n > b.n) {
        return -1
      } else if (a.n < b.n) {
        return 1
      } else {
        if (a.ts > b.ts) {
          return -1
        } else if (a.ts < b.ts) {
          return 1
        } else {
          return 0
        }
      }
    })
  },
}
