import fs from 'fs'
import path from 'path'
import { fileURLToPath } from 'url'
import configModule from 'config'
import Sentry from '@sentry/node'
import Server from './core/server/server.js'

// Set up Sentry reporting as early in the process as possible.
const config = configModule.util.toObject()
const disabledIntegrations = ['Console', 'Http']
Sentry.init({
  dsn: process.env.SENTRY_DSN || config.private.sentry_dsn,
  integrations: integrations => {
    const filtered = integrations.filter(
      integration => !disabledIntegrations.includes(integration.name),
    )
    if (filtered.length !== integrations.length - disabledIntegrations.length) {
      throw Error(
        `An error occurred while filtering integrations. The following inetgrations were found: ${integrations.map(
          ({ name }) => name,
        )}`,
      )
    }
    return filtered
  },
})

if (+process.argv[2]) {
  config.public.bind.port = +process.argv[2]
}
if (process.argv[3]) {
  config.public.bind.address = process.argv[3]
}

console.log('Configuration:')
console.dir(config.public, { depth: null })

if (fs.existsSync('.env')) {
  console.error(
    'Legacy .env file found. It should be deleted and replaced with environment variables or config/local.yml',
  )
  process.exit(1)
}

if (config.private.redis_url != null) {
  console.error(
    'RedisTokenPersistence has been removed. Migrate to SqlTokenPersistence',
  )
  process.exit(1)
}

const legacySecretsPath = path.join(
  path.dirname(fileURLToPath(import.meta.url)),
  'private',
  'secret.json',
)
if (fs.existsSync(legacySecretsPath)) {
  console.error(
    `Legacy secrets file found at ${legacySecretsPath}. It should be deleted and secrets replaced with environment variables or config/local.yml`,
  )
  process.exit(1)
}
export const server = new Server(config)

await server.start()