const Chance = require('chance')
const usersData = require('./userData')

const chance = new Chance()
const {
  heTeamID,
  revTeamID,
  authorTeamID,
  revRecommendationTeamID,
  rev1TeamID,
  heNoRecommendationTeamID,
  revNoEditorRecommendationTeamID,
} = require('./teamIDs')

const keys = Object.keys(usersData)
let users = {}
users = keys.reduce((obj, item) => {
  const userData = usersData[item]
  const isHE = item === 'answerHE' || item === 'handlingEditor'
  let teams = []

  switch (item) {
    case 'answerHE':
      teams = [heTeamID]
      break
    case 'handlingEditor':
      teams = [heTeamID]
      break
    case 'noRecommendationHE':
      teams = [heNoRecommendationTeamID]
      break
    case 'author':
      teams = [authorTeamID]
      break
    case 'reviewer1':
      teams = [rev1TeamID]
      break
    case 'newReviewer':
      teams = [revNoEditorRecommendationTeamID]
      break
    case 'reviewer':
      teams = [revTeamID, revRecommendationTeamID]
      break
    case 'answerReviewer':
      teams = [revTeamID, revRecommendationTeamID]
      break
    case 'inactiveReviewer':
      teams.push(revTeamID)
      break
    case 'recReviewer':
      teams.push(revRecommendationTeamID)
      break
    default:
      teams = []
  }

  obj[item] = {
    ...userData,
    teams,
    type: 'user',
    username: item,
    password: 'password',
    handlingEditor: isHE,
    token: chance.hash(),
    admin: item === 'admin',
    affiliation: chance.company(),
    isConfirmed: item === 'author',
    isActive: !['inactiveUser', 'inactiveReviewer'].includes(item),
    editorInChief: item === 'editorInChief',
    updateProperties: jest.fn(() => users[item]),
    passwordResetTimestamp: item === 'author' ? Date.now() : undefined,
    save: jest.fn(function save() {
      return this
    }),
    notifications: {
      email: {
        user: true,
        system: true,
      },
    },
    accessTokens: {
      confirmation: chance.hash(),
      unsubscribe: chance.hash(),
      invitation: item === 'reviewer' ? chance.hash() : undefined,
      passwordReset: item === 'user' ? chance.hash() : undefined,
    },
    validPassword: jest.fn(function validPassword(password) {
      return this.password === password
    }),
  }

  return obj
}, {})

module.exports = users