// Importation des dépendances et des fichiers nécessaires
const app = require('./app');
const logger = require('./utils/logger');
const database = require('./db/db-connect');

// Port par défaut ou port fourni par les variables d'environnement
let port = process.env.PORT || 3000;

// Fonction pour tenter de démarrer le serveur sur un port spécifique
async function tryStartServerOnPort(port) {
  return new Promise((resolve, reject) => {
    // Tentative d'écoute sur le port
    const server = app.listen(port, () => {
      logger.log('info', `EasyTransport est lancé sur le port ${port}`);
      logger.log('info', `Vous pouvez accéder à EasyTransport en renseignant "localhost:${port}" dans un navigateur.`);
      resolve();
    })
    .on('error', (error) => {
      server.close();
      reject(error);
    });
  });
}

// Fonction principale pour démarrer le serveur
async function startServer() {
  // Tentative de connexion à la base de données
  try {
    await database.connect();
  } catch (error) {
    logger.log('error', "Erreur lors de la connexion à la base de données", error);
    process.exit(1);
  }

  // Tentative de démarrage du serveur
  while (true) {
    try {
      await tryStartServerOnPort(port);
      break;
    } catch (error) {
      // Gestion d'erreur si le port est déjà en cours d'utilisation
      if (error.code === 'EADDRINUSE') {
        logger.log('warn', `Le port ${port} est déjà utilisé, tentative sur le port ${++port}.`);
      } else {
        logger.log('error', "Erreur lors du démarrage du serveur", error);
        process.exit(1);
      }
    }
  }
}

// Démarrage du serveur
startServer().catch(error => {
  logger.log('error', "Erreur inattendue", error);
  process.exit(1);
});
