/*!
 * lib/auth/authentication-manager.js
 * Copyright © 2019 – Katana Cryptographic Ltd. All Rights Reserved.
 */
'use strict'

const passport = require('passport')
const network = require('../bitcoin/network')
const keys = require('../../keys/')[network.key]
const errors = require('../errors')
const Logger = require('../logger')


/**
 * A singleton managing the authentication to the API
 */
class AuthenticationManager {

  /**
   * Constructor
   */
  constructor() {
    this.activeStrategyName = ''
    this.activeStrategy = null
    // Configure the authentication strategy
    this._configureStrategy()
  }

  /**
   * Configure the active strategy
   */
  _configureStrategy() {
    if (keys.auth.activeStrategy) {
      this.activeStrategyName = keys.auth.activeStrategy

      try {
        const configuratorName = keys.auth.strategies[this.activeStrategyName].configurator
        const Configurator= require(`./${configuratorName}`)

        if (Configurator) {
          this.activeStrategy = new Configurator()
          this.activeStrategy.configure()
          Logger.info(`Auth : Authentication strategy ${this.activeStrategyName} successfully configured`)
        }

      } catch(e) {
        Logger.error(e, errors.auth.INVALID_CONF)
      }
    }
  }

  /**
   * Authenticate a user
   * @param {Object} options
   */
  authenticate(options) {
    return passport.authenticate(this.activeStrategyName, options)
  }

  /**
   * Serialize user's information
   * @param {Object} req - http request object
   * @param {Object} res - http response object
   * @param {function} next - callback
   */
  serialize(req, res, next) {
    if (req.user == null)
      req.user = {}

    req.user['authenticated'] = true
    next()
  }

}


module.exports = new AuthenticationManager()