'use strict'

/* global wiki */

const _ = require('lodash')

module.exports = (passport) => {
  // Serialization user methods

  passport.serializeUser(function (user, done) {
    done(null, user._id)
  })

  passport.deserializeUser(function (id, done) {
    wiki.db.User.findById(id).then((user) => {
      if (user) {
        done(null, user)
      } else {
        done(new Error(wiki.lang.t('auth:errors:usernotfound')), null)
      }
      return true
    }).catch((err) => {
      done(err, null)
    })
  })

  // Load authentication strategies

  wiki.config.authStrategies = {
    list: _.pickBy(wiki.config.auth, strategy => strategy.enabled),
    socialEnabled: (_.chain(wiki.config.auth).omit('local').filter(['enabled', true]).value().length > 0)
  }

  _.forOwn(wiki.config.authStrategies.list, (strategyConfig, strategyName) => {
    strategyConfig.callbackURL = `${wiki.config.site.host}/login/${strategyName}/callback`
    require(`../authentication/${strategyName}`)(passport, strategyConfig)
    wiki.logger.info(`Authentication Provider ${_.upperFirst(strategyName)}: OK`)
  })

  // Create Guest account for first-time

  return wiki.db.User.findOne({
    where: {
      provider: 'local',
      email: 'guest@example.com'
    }
  }).then((c) => {
    if (c < 1) {
      return wiki.db.User.create({
        provider: 'local',
        email: 'guest@example.com',
        name: 'Guest',
        password: '',
        role: 'guest'
      }).then(() => {
        wiki.logger.info('[AUTH] Guest account created successfully!')
        return true
      }).catch((err) => {
        wiki.logger.error('[AUTH] An error occured while creating guest account:')
        wiki.logger.error(err)
        return err
      })
    }
  })

  // .then(() => {
  //   if (process.env.WIKI_JS_HEROKU) {
  //     return wiki.db.User.findOne({ provider: 'local', email: process.env.WIKI_ADMIN_EMAIL }).then((c) => {
  //       if (c < 1) {
  //         // Create root admin account (HEROKU ONLY)

  //         return wiki.db.User.create({
  //           provider: 'local',
  //           email: process.env.WIKI_ADMIN_EMAIL,
  //           name: 'Administrator',
  //           password: '$2a$04$MAHRw785Xe/Jd5kcKzr3D.VRZDeomFZu2lius4gGpZZ9cJw7B7Mna', // admin123 (default)
  //           role: 'admin'
  //         }).then(() => {
  //           wiki.logger.info('[AUTH] Root admin account created successfully!')
  //           return true
  //         }).catch((err) => {
  //           wiki.logger.error('[AUTH] An error occured while creating root admin account:')
  //           wiki.logger.error(err)
  //           return err
  //         })
  //       } else { return true }
  //     })
  //   } else { return true }
  // })
}