// Eventually, I'd like this to be run through Commander so it can confirm things before just overwriting stuff.

const path = require('path');
const Sequelize = require('sequelize');
const getSequelizeModels = require('./server/getSequelizeModels');
const force = typeof process.argv[2] !== 'undefined' && process.argv[2] === 'force';
let siteConfig;
try {
  siteConfig = require('./server/config.json');
} catch (ex) {
  console.error('Please copy `config.example.json` to `config.json` and fill it with your server\'s data.');
  process.exit(1);
}

const sequelizeConfig = {
  dialect: siteConfig.db_engine,
};
switch (siteConfig.db_engine) {
  case 'sqlite': {
    sequelizeConfig.storage = typeof siteConfig.sqlite_location !== 'undefined'
      ? (
        siteConfig.sqlite_location.substr(0, 1) === '.' // If relative path, make relative to ./server
          ? path.resolve('./server/', siteConfig.sqlite_location)
          : path.resolve(siteConfig.sqlite_location)
      )
      : path.resolve(__dirname, './server/database.sqlite');
    break;
  }
  default: {
    sequelizeConfig.host = siteConfig.db_host;
    sequelizeConfig.port = siteConfig.db_port;
    sequelizeConfig.database = siteConfig.db_database;
    sequelizeConfig.username = siteConfig.db_username;
    sequelizeConfig.password = siteConfig.db_password;
  }
}

const sequelize = new Sequelize(sequelizeConfig);

const Models = getSequelizeModels(sequelize);

sequelize.sync({ force }).then(() => {
  const promises = [ // Default status types to use in Statuses
    { name: 'update' },
    { name: 'progress' },
    { name: 'rating' },
    { name: 'review' },
  ].map(statusType => Models.StatusType.create(statusType).catch(() => console.log(statusType.name, 'already exists')));
  return Promise.all(promises);
}).then(() => {
  sequelize.close();
});