import { promisify } from 'node:util'
import Settings from '@overleaf/settings'
import AdminController from '../app/src/Features/ServerAdmin/AdminController.mjs'
import minimist from 'minimist'
import { fileURLToPath } from 'node:url'
import { scriptRunner } from './lib/ScriptRunner.mjs'

const args = minimist(process.argv.slice(2), {
  string: ['confirm-site-url', 'delay-in-seconds'],
  default: {
    'delay-in-seconds': 10,
    'confirm-site-url': '',
  },
})

const sleep = promisify(setTimeout)

async function main() {
  if (args.help) {
    console.error()
    console.error(
      '  usage: node disconnect_all_users.mjs [--delay-in-seconds=10] --confirm-site-url=https://www....\n'
    )
    process.exit(1)
  }
  const isSaaS = Boolean(Settings.overleaf)
  if (isSaaS && args['confirm-site-url'] !== Settings.siteUrl) {
    console.error()
    console.error(
      'Please confirm the environment you want to disconnect ALL USERS from by specifying the site URL aka PUBLIC_URL, e.g. --confirm-site-url=https://www.dev-overleaf.com for the dev-env'
    )
    console.error()
    console.error(
      `!!!  --confirm-site-url=${
        args['confirm-site-url'] || "''"
      } does not match the PUBLIC_URL in this environment.`
    )
    console.error()
    console.error('  Are you running this script in the correct environment?')
    process.exit(1)
  }
  const delay = parseInt(args['delay-in-seconds'] || '10', 10)
  if (!(delay >= 0)) {
    console.error(
      `--delay-in-seconds='${args['delay-in-seconds']}' should be a number >=0`
    )
    process.exit(1)
  }
  console.log()
  console.log(
    `Disconnect all users from ${args['confirm-site-url']}, with delay ${delay}`
  )

  if (isSaaS) {
    console.error('  Use CTRL+C in the next 5s to abort.')
    await sleep(5 * 1000)
  }

  await AdminController._sendDisconnectAllUsersMessage(delay)
}

if (fileURLToPath(import.meta.url) === process.argv[1]) {
  try {
    await scriptRunner(main)
    console.error('Done.')
    process.exit(0)
  } catch (error) {
    console.error('Error', error)
    process.exit(1)
  }
}
