/**
 * Server entry point for SentryAgent.ai AgentIdP.
 * Loads environment variables, creates the app, and starts listening.
 */

import * as dotenv from 'dotenv';
dotenv.config();

import { createApp } from './app.js';
import { reloadOpaPolicy } from './middleware/opa.js';

const PORT = parseInt(process.env['PORT'] ?? '3000', 10);

/**
 * Bootstraps the application and starts the HTTP server.
 */
async function main(): Promise<void> {
  try {
    const app = await createApp();

    const server = app.listen(PORT, () => {
      // eslint-disable-next-line no-console
      console.log(`SentryAgent.ai AgentIdP listening on port ${PORT}`);
    });

    // Graceful shutdown
    const shutdown = (): void => {
      // eslint-disable-next-line no-console
      console.log('Shutting down gracefully...');
      server.close(() => {
        process.exit(0);
      });
    };

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

    // Hot-reload OPA policy without restarting the server
    process.on('SIGHUP', () => {
      reloadOpaPolicy().catch((err) => {
        // eslint-disable-next-line no-console
        console.error('[AgentIdP] Failed to reload OPA policy:', err);
      });
    });
  } catch (err) {
    // eslint-disable-next-line no-console
    console.error('Failed to start server:', err);
    process.exit(1);
  }
}

void main();
