/* eslint-disable import/first */
// eslint-disable-next-line import/newline-after-import
import dotenv from 'dotenv';
dotenv.config();

import 'reflect-metadata';
import logger from '@zenvia/logger';

import { initDB } from './infra/db';

async function initAppLayers(): Promise<void> {
  logger.info('Initializing app layers (Infra/Services) to inject dependencies');

  await import('./infra');
  await import('./application');
}

async function start(): Promise<void> {
  logger.info('Initializing the application');
  try {
    await initDB();

    await initAppLayers();

    const { conciliationAutomationController } = await import('./presentation');

    await conciliationAutomationController.execute();
  } catch (error) {
    // eslint-disable-next-line no-console
    console.error(error);
    logger.error('An error occurred while executing the application:', error);
    process.exit(1);
  }
}

const signalTraps: NodeJS.Signals[] = ['SIGTERM', 'SIGINT', 'SIGUSR2', 'SIGHUP'];

signalTraps.forEach((type) => {
  process.once(type, async () => {
    try {
      logger.info('Caught interrupt signal');
    } finally {
      process.kill(process.pid, type);
    }
  });
});

start();
