timeago = require 'timeago'
passport = require 'passport'
User = require './models/User'

module.exports = (app) ->

  app.models.User = User

  try
    permissions = require "#{process.env.PWD}/config/users/permissions"
  catch e
    permissions = require "./test/project/config/users/permissions"

  require('./auth/strategy')(passport)
  require('./auth/checkpoint') User, permissions
  require('./auth/middleware')(app)

  {authenticate, authorize} = app

  # Helpers
  app.locals
    title: 'Modulo#users'
    messages: {}
    timestamp: (date) ->
      if date
        "<a href='#' rel='tooltip' data-original-title='#{date}'>#{timeago(date)}</a>"
      else
        ''

  # Dynamic Helpers
  app.all '/*', (req, res, next) ->
    res.locals
      user: req.user
      _csrf: req.session._csrf
    next()

  # GET /signup
  app.get '/signup', (req, res, next) ->
    if app.settings.signups is false then return next()
    res.render "users/signup",
      title: 'Signup'
      signup: {}
      messages:
        errors: req.flash()

  # POST /signup
  app.post '/signup', (req, res, next) ->
    if app.settings.signups is false then return next()
    user = new User req.body
    user.save (err) ->
      if err
        if err.code is 11000
          err.message = ["#{user.email} is already signed up!"]
        req.flash 'error', err.message
        res.render "users/signup",
          title: 'Signup'
          signup: req.body
          messages:
            error: req.flash 'error'
            errors: err.errors
      else
        req.flash 'success', 'Signed up successfully'
        passport.authenticate('local', successRedirect: '/')(req, res, next)

  # GET /login
  app.get '/login', (req, res) ->
    res.render "users/login",
      title: 'Login'
      messages:
        error: req.flash 'error'

  # POST /login
  app.post '/login', passport.authenticate('local',
    successRedirect: '/'
    successFlash: true
    failureRedirect: '/login'
    failureFlash: true
  )

  # GET /logout
  app.get '/logout', (req, res) ->
    req.logout()
    req.flash 'success', 'You have been logged out.'
    res.redirect '/'

  # GET /account
  app.get '/account', authenticate, (req, res) ->
    res.render "users/account/index",
      title: 'Account'
      messages: req.flash()

  # GET /users
  app.get '/users', authorize('read', User), (req, res) ->
    User.find {}, (err, users) ->
      res.render "users/users/index",
        title: 'Users'
        users: users
