import { buildApp, startBackgroundJobs } from './app.js';
import { config, validateStartupConfig } from './config.js';
import { closeDb } from './db/index.js';
import { stopGmailPoller } from './services/gmail.service.js';
import { stopMondayPoller } from './services/monday.service.js';

validateStartupConfig();

const app = await buildApp();
let shuttingDown = false;

async function shutdown(signal: string): Promise<void> {
  if (shuttingDown) return;
  shuttingDown = true;
  console.log(`[shutdown] ${signal} received`);
  stopGmailPoller();
  stopMondayPoller();
  try {
    await app.close();
    closeDb();
  } catch (err) {
    console.error('[shutdown] error:', err);
  }
  process.exit(0);
}

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

try {
  await app.listen({ port: config.port, host: config.host });
  console.log(`TicketGate listening on http://${config.host}:${config.port}`);
  if (config.isProduction) {
    console.log(`Public URL: ${config.publicBaseUrl}`);
  }
  startBackgroundJobs();
} catch (err) {
  app.log.error(err);
  process.exit(1);
}
