/* global WIKI */

const _ = require('lodash')
const passport = require('passport')
const fs = require('fs-extra')
const path = require('path')
const autoload = require('auto-load')

module.exports = {
  strategies: {},
  init() {
    this.passport = passport

    // Serialization user methods

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

    passport.deserializeUser(function (id, done) {
      WIKI.db.users.query().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

    const modules = _.values(autoload(path.join(WIKI.SERVERPATH, 'modules/authentication')))
    _.forEach(modules, (strategy) => {
      const strategyConfig = _.get(WIKI.config.auth.strategies, strategy.key, { isEnabled: false })
      strategyConfig.callbackURL = `${WIKI.config.site.host}${WIKI.config.site.path}login/${strategy.key}/callback`
      strategy.config = strategyConfig
      if (strategyConfig.isEnabled) {
        try {
          strategy.init(passport, strategyConfig)
        } catch (err) {
          WIKI.logger.error(`Authentication Provider ${strategy.title}: [ FAILED ]`)
          WIKI.logger.error(err)
        }
      }
      fs.readFile(path.join(WIKI.ROOTPATH, `assets/svg/auth-icon-${strategy.key}.svg`), 'utf8').then(iconData => {
        strategy.icon = iconData
      }).catch(err => {
        if (err.code === 'ENOENT') {
          strategy.icon = '[missing icon]'
        } else {
          WIKI.logger.warn(err)
        }
      })
      this.strategies[strategy.key] = strategy
      WIKI.logger.info(`Authentication Provider ${strategy.title}: [ OK ]`)
    })

    return this
  }
}