const { dropDatabase, createDatabase } = require("pg-god");
const { createConnection } = require("typeorm");

const path = require("path");

const DbTestUtil = {
  db_: null,

  setDb: function (connection) {
    this.db_ = connection;
  },

  clear: function () {
    return this.db_.synchronize(true);
  },

  shutdown: async function () {
    await this.db_.close();
    return dropDatabase({ databaseName });
  },
};

const instance = DbTestUtil;

module.exports = {
  initDb: async function ({ cwd }) {
    const migrationDir = path.resolve(
      path.join(
        cwd,
        `node_modules`,
        `@medusajs`,
        `medusa`,
        `dist`,
        `migrations`
      )
    );

    const databaseName = "medusa-fixtures";
    await createDatabase({ databaseName });

    const connection = await createConnection({
      type: "postgres",
      url: "postgres://localhost/medusa-fixtures",
      migrations: [`${migrationDir}/*.js`],
    });

    await connection.runMigrations();
    await connection.close();

    const modelsLoader = require(path.join(
      cwd,
      `node_modules`,
      `@medusajs`,
      `medusa`,
      `dist`,
      `loaders`,
      `models`
    )).default;

    const entities = modelsLoader({}, { register: false });
    const dbConnection = await createConnection({
      type: "postgres",
      url: "postgres://localhost/medusa-fixtures",
      entities,
    });

    instance.setDb(dbConnection);
    return dbConnection;
  },
  useDb: function () {
    return instance;
  },
};
