// start the server
import pkg from '../package.json'
import createApp from './app'
import { Consola } from 'consola'
import { Browser } from 'puppeteer'
import { Server } from 'http'

const port = process.env.APP_PORT || 3000
let server: Server | undefined

createApp().then(({ app, container }) => {
  const logger = container.resolve<Consola>('logger')

  function handleTearDown() {
    app.set('gracefullyExiting', true)
    logger.info('Attempting gracefully shutdown of the server, waiting for remaining connections to complete.')

    server.close(async () => {
      logger.info('No more connections, shutting down.')
      const browser = container.resolve<Browser>('browser')
      await browser.close()
      process.exit()
    })

    setTimeout(() => {
      logger.error('Could not close connections in time, forcefully shutting down.')
      process.exit(1)
    }, 30 * 100) // 30s
  }

  process.on('SIGINT', handleTearDown)
  process.on('SIGTERM', handleTearDown)

  const server = app.listen(port, () => {
    logger.success(`${pkg.name} v${pkg.version} is running at http://localhost:${port}`)
  })
})

export default server