'use strict'

/* global wiki */

const fs = require('fs')
const path = require('path')
const _ = require('lodash')
const Promise = require('bluebird')

/**
 * PostgreSQL DB module
 */
module.exports = {

  Sequelize: require('sequelize'),

  /**
   * Initialize DB
   *
   * @return     {Object}  DB instance
   */
  init() {
    let self = this

    let dbModelsPath = path.join(wiki.SERVERPATH, 'models')

    // Define Sequelize instance

    self.inst = new self.Sequelize(wiki.config.db.db, wiki.config.db.user, wiki.config.db.pass, {
      host: wiki.config.db.host,
      port: wiki.config.db.port,
      dialect: 'postgres',
      pool: {
        max: 10,
        min: 0,
        idle: 10000
      },
      logging: false
    })

    // Attempt to connect and authenticate to DB

    self.inst.authenticate().then(() => {
      wiki.logger.info('Database (PostgreSQL) connection: OK')
    }).catch(err => {
      wiki.logger.error('Failed to connect to MongoDB instance.')
      return err
    })

    // Load DB Models

    fs
      .readdirSync(dbModelsPath)
      .filter(function (file) {
        return (file.indexOf('.') !== 0 && file.indexOf('_') !== 0)
      })
      .forEach(function (file) {
        let modelName = _.upperFirst(_.camelCase(_.split(file, '.')[0]))
        self[modelName] = self.inst.import(path.join(dbModelsPath, file))
      })

    // Associate DB Models

    require(path.join(dbModelsPath, '_relations.js'))(self)

    // Sync DB

    self.onReady = (wiki.IS_MASTER) ? self.inst.sync({
      force: false,
      logging: false
    }) : Promise.resolve()

    return self
  }

}