"use strict";

const Sequelize = require('sequelize'),
  config = require('config');

function init() {
  const db = {
    sequelize: new Sequelize(config.get("db.users")),
    Sequelize: Sequelize
  };

  return db.sequelize.authenticate().then(function () {
    const User = db.sequelize.define('users', {
      id: {
        type: Sequelize.INTEGER,
        primaryKey: true,
        autoIncrement: true
      },
      displayName: Sequelize.STRING,
      notes: Sequelize.STRING,
      uid: Sequelize.STRING,
      authToken: Sequelize.STRING,
      authDate: Sequelize.DATE,
      authenticated: Sequelize.BOOLEAN,
      mailVerified: Sequelize.BOOLEAN,
      mail: Sequelize.STRING,
      memberSince: Sequelize.DATE,
      password: Sequelize.STRING, /* SHA hash of user supplied password */
      passwordExpires: Sequelize.DATE
    }, {
      timestamps: false
    });

    const Authentication = db.sequelize.define('authentication', {
      key: {
        type: Sequelize.STRING,
        primaryKey: true,
        allowNull: false
      },
      issued: Sequelize.DATE,
      type: {
        type: Sequelize.ENUM,
        values: [ 'account-setup', 'password-reset' ]
      },
      userId: {
        type: Sequelize.INTEGER,
        allowNull: false,
        references: {
          model: User,
          key: 'id',
        }
      }
    }, {
      timestamps: false
    });

    return db.sequelize.sync({
      force: false
    }).then(function () {
      return db;
    });
  }).catch(function (error) {
    console.log("ERROR: Failed to authenticate with USER DB");
    console.log("ERROR: " + JSON.stringify(config.get("db"), null, 2));
    console.log(error);
    throw error;
  });
}

module.exports = init();
