/* eslint-disable
    no-return-assign,
*/
// TODO: This file was created by bulk-decaffeinate.
// Fix any style issues and re-enable lint.
/*
 * decaffeinate suggestions:
 * DS101: Remove unnecessary use of Array.from
 * DS102: Remove unnecessary code created because of implicit returns
 * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
 */
let DrainManager
const logger = require('logger-sharelatex')

module.exports = DrainManager = {
  startDrainTimeWindow(io, minsToDrain) {
    const drainPerMin = io.sockets.clients().length / minsToDrain
    return DrainManager.startDrain(io, Math.max(drainPerMin / 60, 4))
  }, // enforce minimum drain rate

  startDrain(io, rate) {
    // Clear out any old interval
    let pollingInterval
    clearInterval(this.interval)
    logger.log({ rate }, 'starting drain')
    if (rate === 0) {
      return
    } else if (rate < 1) {
      // allow lower drain rates
      // e.g. rate=0.1 will drain one client every 10 seconds
      pollingInterval = 1000 / rate
      rate = 1
    } else {
      pollingInterval = 1000
    }
    return (this.interval = setInterval(() => {
      return this.reconnectNClients(io, rate)
    }, pollingInterval))
  },

  RECONNECTED_CLIENTS: {},
  reconnectNClients(io, N) {
    let drainedCount = 0
    for (const client of Array.from(io.sockets.clients())) {
      if (!this.RECONNECTED_CLIENTS[client.id]) {
        this.RECONNECTED_CLIENTS[client.id] = true
        logger.log(
          { client_id: client.id },
          'Asking client to reconnect gracefully'
        )
        client.emit('reconnectGracefully')
        drainedCount++
      }
      const haveDrainedNClients = drainedCount === N
      if (haveDrainedNClients) {
        break
      }
    }
    if (drainedCount < N) {
      return logger.log('All clients have been told to reconnectGracefully')
    }
  }
}