var mongoose = require('mongoose').set('debug', process.env.VITE_DEBUG);

// Configurazione globale di Mongoose
mongoose.Promise = global.Promise;
mongoose.level = "";
mongoose.set('debug', false);
mongoose.set('strictQuery', false);

// Opzioni di connessione
let options = {
  maxPoolSize: 5,
  // useNewUrlParser: true,
  // useUnifiedTopology: true,
  serverSelectionTimeoutMS: 20000, // Timeout di 30 secondi per la selezione del server
};

// Controllo dell'autenticazione
console.log('process.env.AUTH_MONGODB', process.env.AUTH_MONGODB);

const username = encodeURIComponent(process.env.MONGODB_USER);
const password = encodeURIComponent(process.env.MONGODB_PWD);


if (process.env.AUTH_MONGODB === '1') {
  options.auth = {
    authSource: "admin",
    username,
    password
  };
}

if (options.auth && options.auth.username) {
  console.log('MongoDb con Authenticazione:', options.auth.username, '******');
} else {
  console.log('### MongoDb SENZA Authenticazione !!! ');
}

// Stampa delle informazioni di sistema
console.log('Node Version ' + process.version);
console.log('Mongoose Version ' + mongoose.version);

// URL di connessione
const connectionUrl = process.env.MONGODB_URI;
console.log('Connessione a ' + process.env.MONGODB_URI_NOPWD + ' in corso...');

// Funzione per connettersi al database con retry
async function connectToDatabase(uri, opts) {
  let isConnected = false;

  while (!isConnected) {
    try {
      console.log("Sto provando a connettermi al database...");
      await mongoose.connect(uri);

      console.log('   *** CONNESSIONE EFFETTUATA ! ' + ' db: ' + process.env.DATABASE);

      console.log('   Database corrente:', mongoose.connection.name);

      // Ottieni l'URL completo della connessione
      // console.log('   URL di connessione:', mongoose.connection.client.s.url);

      const db = mongoose.connection;
      const serverInfo = await db.db.admin().serverStatus(); // Ottieni lo stato del server
      console.log(`   Versione di MongoDB: ${serverInfo.version}`); // Stampa la versione

      isConnected = true; // Imposta la flag di connessione a true
    } catch (error) {
      console.error("   Errore durante la connessione al database:", error.message);

      // if (error.name === 'MongooseServerSelectionError' || error.name === 'MongoServerError') {
      console.log("   Ritento la connessione tra 1 minuto...");
      await new Promise((resolve) => setTimeout(resolve, 60000)); // Attendi 1 minuto prima di ritentare
      /*} else {
        console.error("   Errore irreversibile. Arresto il processo.");
        await new Promise((resolve) => setTimeout(resolve, 10000)); // Attendi 1 minuto prima di ritentare
        process.exit(1); // Termina il processo in caso di errore irreversibile
      }*/
    }
  }
}


// Esporta Mongoose
module.exports = { mongoose, connectToDatabase, connectionUrl, options };