var jwtutil = require('../../../util/jwtutil')
var urlutil = require('../../../util/urlutil')

var dbapi = require('../../../db/api')

module.exports = function(options) {
  return function(req, res, next) {
    if (req.query.jwt) {
      // Coming from auth client
      var data = jwtutil.decode(req.query.jwt, options.secret)
      var serial = req.query.serial;
      var redir = urlutil.removeParam(req.url, 'jwt')
      if (serial) {
        redir = urlutil.removeParam(req.url, 'serial') + '#!/control/' + serial;
      }
      if (data) {
        // Redirect once to get rid of the token
        dbapi.saveUserAfterLogin({
            name: data.name
          , email: data.email
          , ip: req.ip
          })
          .then(function() {
            req.session.jwt = data
            res.redirect(redir)
          })
          .catch(next)
      }
      else {
        // Invalid token, forward to auth client
        res.redirect(options.authUrl)
      }
    }
    else if (req.session && req.session.jwt) {
      dbapi.loadUser(req.session.jwt.email)
        .then(function(user) {
          if (user) {
            // Continue existing session
            req.user = user
            next()
          }
          else {
            // We no longer have the user in the database
            res.redirect(options.authUrl)
          }
        })
        .catch(next)
    }
    // Authenticate mock sessions in development.
    else if (req.query.authed) {
      req.user = {
        name: 'auth',
        email: 'auth',
        ip: 'auth'
      };

      req.session.jwt = req.user;

      next();
    }
    else {
      // No session, forward to auth client
      res.redirect(options.authUrl)
    }
  }
}
