"use strict";

const fs = require("fs");
const path = require("path");
const Sequelize = require("sequelize");
const process = require("process");
const basename = path.basename(__filename);
let config;

try {
  // Prefer legacy app-specific configuration when available
  // eslint-disable-next-line import/no-dynamic-require, global-require
  config = require("../app/config/db.config.js");
} catch (error) {
  if (error.code !== "MODULE_NOT_FOUND") {
    throw error;
  }
  // Fallback to the shared config loader
  // eslint-disable-next-line import/no-dynamic-require, global-require
  const appConfig = require("../src/config/config.js");
  const dbConfig = appConfig.db || {};
  config = {
    database: dbConfig.name,
    username: dbConfig.username,
    password: dbConfig.password,
    host: dbConfig.host,
    port: dbConfig.port,
    dialect: dbConfig.dialect,
    logging: false
  };
}
require("dotenv").config();

const db = {};

const sequelize = new Sequelize(
  config.database,
  config.username,
  config.password,
  config
);

fs.readdirSync(__dirname)
  .filter((file) => {
    return (
      file.indexOf(".") !== 0 &&
      file !== basename &&
      file.slice(-3) === ".js" &&
      file.indexOf(".test.js") === -1
    );
  })
  .forEach((file) => {
    const model = require(path.join(__dirname, file))(
      sequelize,
      Sequelize.DataTypes
    );
    db[model.name] = model;
  });

Object.keys(db).forEach((modelName) => {
  if (db[modelName].associate) {
    db[modelName].associate(db);
  }
});

db.sequelize = sequelize;
// db.Sequelize = Sequelize;
db.Op = Sequelize.Op;

module.exports = db;
