'use strict';

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

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

  return db.sequelize.authenticate().then(function () {
    const Group = db.sequelize.define('group', {
      id: {
        type: Sequelize.INTEGER,
        primaryKey: true,
        autoIncrement: true
      },
      name: Sequelize.STRING,
      ownerId: Sequelize.INTEGER
    }, {
      timestamps: false,
      classMethods: {
        associate: function() {}
      }
    });

    const User = db.sequelize.define('users', {
      id: {
        type: Sequelize.INTEGER,
        primaryKey: true,
        autoIncrement: true
      },
      familyName: Sequelize.STRING,
      firstName: Sequelize.STRING,
      uid: Sequelize.STRING,
      md5: Sequelize.STRING, /* md5 of email address for Gravatar */
      authToken: Sequelize.STRING,
      authDate: Sequelize.DATE,
      authenticated: Sequelize.BOOLEAN,
      mailVerified: Sequelize.BOOLEAN,
      email: Sequelize.STRING,
      memberSince: Sequelize.DATE,
      password: Sequelize.STRING, /* SHA hash of user supplied password */
      passwordExpires: Sequelize.DATE
    }, {
      timestamps: false
    });

    // eslint-disable-next-line no-unused-vars
    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
    });
    
    // eslint-disable-next-line no-unused-vars
    const GroupUsers = db.sequelize.define('groupuser', {
      groupId: {
        type: Sequelize.INTEGER,
        allowNull: false,
        references: {
          model: Group,
          key: 'id'
        }
      },
      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 GROUP DB');
    console.log('ERROR: ' + JSON.stringify(config.get('db'), null, 2));
    console.log(error);
    throw error;
  });
}

module.exports = { goodTimesDB: { init } };
