const config = require('../config/local')

const testOutMongoDB = async () => {
  const {
    MongoClient
  } = require('mongodb')
  // const connection = "mongodb+srv://<username>:<password>@<your-cluster-url>/test?retryWrites=true&w=majority";
  const connection = config.mongo.connectionString
  const client = new MongoClient(connection)

  try {
    await client.connect()

    const dbs = await client.db().admin().listDatabases()
    if (dbs.databases.some(db => db.name.length > 0)) {
      console.log('Connected to MongoDB')
    }
  } catch (e) {
    console.error(e)
  } finally {
    // close connection
    await client.close()
  }
}

const testOutRabbitMQ = async () => {
  const amqp = require('amqplib/callback_api')
  const conString = config.rabbitMQ.connectionString
  amqp.connect(conString, function (error0, connection) {
    if (error0) {
      throw error0
    }
    connection.createChannel(function (error1, channel) {
      if (error1) {
        throw error1
      }
      const queue = 'hello'
      const msg = 'Hello world'

      channel.assertQueue(queue, {
        durable: false
      })

      channel.sendToQueue(queue, Buffer.from(msg))
      console.log('Connected to RabbitMQ')
    })

    // close connection
    setTimeout(function () {
      connection.close()
      process.exit(0)
    }, 500)
  })
}

const testOutPostgres = async () => {
  const pg = require('pg')
  const conString = config.postgres.connectionString

  const client = new pg.Client(conString)
  client.connect()

  await client
    .query('SELECT NOW() as now')
    .then(res => {
      if (res.rows[0].now instanceof Date) {
        console.log('Connected to Postgres')
      }
    })
    .catch(e => console.error(e.stack))

  await client.end(err => {
    if (err) {
      console.log('Error during disconnection', err.stack)
    }
  })
}

const main = async () => {
  await testOutMongoDB(config.mongo.connectionString)

  await testOutRabbitMQ(config.mongo.connectionString)

  await testOutPostgres(config.mongo.connectionString)
}

// run the test
main().catch(console.error)
