import { buildApp } from './app.ts'
import { loadConfig } from './config.ts'
import { assertDatabaseConnection, createDatabase } from './db/database.ts'

const config = loadConfig()
const db = createDatabase(config)
const app = buildApp(config, db)

// Pas de process.exit() : on fixe le code de sortie et on laisse la boucle d'événements se vider,
// ce qui garantit que les logs et les connexions en cours sont terminés proprement.
async function shutdown(exitCode: number): Promise<void> {
  process.exitCode = exitCode
  try {
    await app.close()
  } catch (error: unknown) {
    app.log.error({ err: error }, "Erreur pendant l'arrêt de l'API")
    process.exitCode = 1
  }
}

process.on('SIGINT', () => void shutdown(0))
process.on('SIGTERM', () => void shutdown(0))

try {
  await assertDatabaseConnection(db)
  app.log.info('Connexion à MariaDB établie')
  await app.listen({ host: config.API_HOST, port: config.API_PORT })
} catch (error: unknown) {
  app.log.fatal({ err: error }, "Impossible de démarrer l'API")
  await shutdown(1)
}
