#--
#            DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
#                    Version 2, December 2004
#
#            DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
#   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
#
#  0. You just DO WHAT THE FUCK YOU WANT TO.
#++

class ${ClassName}
  get '/user/login/?' do
    @error = 'You are already logged in.' if logged_in?
    erb :'user/login'
  end

  get '/user/logout/?' do
    if logged_in?
      current_user.logout!
      delete_login!
      @success = 'Logout successful.'
    else
      @error   = 'You are not logged in.'
    end
    erb :'user/logout'
  end

  get '/user/signup/?' do
    @error = 'You are already logged in.' if logged_in?
    erb :'user/signup'
  end

  get '/user/lost_password/?' do
    @error = 'You are already logged in.' if logged_in?
    erb :'user/lost_password'
  end

  get '/user/password_recovery/?' do
    @error = 'You are already logged in.' if logged_in?
    erb :'user/password_recovery'
  end

  get '/user/change_level/?' do
    if not logged_in?
      @error = 'You need to log in.'
    elsif not current_user.staff?
      @error = 'Go home, this is not a place for you.'
    else
      @users = User.all
    end
    erb :'user/change_level'
  end

  post '/user/login/?' do
    if not fields? :username, :password
      @error   = 'You have to complete all the required fields.'
    elsif logged_in?
      @error   = 'You are already logged in.'
    else
      session  = User.login params[:username], params[:password]
      if session
        set_login! session
        @success = 'Login successful.'
      else
        @error   = 'Login failed.'
      end
    end
    erb :'user/login'
  end

  post '/user/signup/?' do
    if not fields? :username, :email, :password
      @error   = 'You have to complete all the required fields.'
    elsif logged_in?
      @error = 'You are already logged in.'
    elsif User.exists? params[:username]
      @error = 'The username you have chosen is already taken.'
    else
      level = User.empty? ? User.founder : User.user
      user  = User.signup params[:username], params[:email], params[:password], level
      if user.errors.any?
        @error   = user.errors.first
      else
        @success = 'Sign up successful.'
      end
    end
    erb :'user/signup'
  end

  post '/user/lost_password/?' do
    if not fields? :username
      @error   = 'You have to complete all the required fields.'
    elsif logged_in?
      @error   = 'You are already logged in.'
    elsif User.exists? params[:username]
      passcode = User.lost_password params[:username]
      # send a mail or what you want
      @success = 'You should receive a mail with the instructions to recover your password.'
    else
      @error   = 'The given username doesn\'t exists.'
    end
    erb :'user/lost_password'
  end

  post '/user/password_recovery/?' do
    if not fields? :username, :passcode, :password
      @error   = 'You have to complete all the required fields.'
    elsif logged_in?
      @error   = 'You are already logged in.'
    elsif User.password_recovery params[:username], params[:passcode], params[:password]
      @success = 'Password set successful.'
    else
      @error   = 'Error setting the password.'
    end
    erb :'user/password_recovery'
  end

  post '/user/change_level/?' do
    if not logged_in?
      @error = 'You need to log in.'
    elsif not current_user.staff?
      @error = 'Go home, this is not a place for you.'
    elsif fields? :username, :go
      @user   = User.get params[:username]
      @levels = User.levels
    elsif not fields? :username, :level
      @error = 'To change a user level, you need to send his username and level.'
    else
      level = case # I guess using #send could be dangerous
        when 'banned'  then User.banned
        when 'founder' then User.founder
        when 'admin'   then User.admin
        when 'smod'    then User.smod
        when 'mod'     then User.mod
        when 'user'    then User.user
        else                nil
      end
      if level.nil?
        @error = 'User level not recognized.'
      else
        user = User.change_level params[:username], level
        if user
          @success = 'User level set successful.'
        else
          @error   = 'Error setting the user level.'
        end
      end
    end
    erb :'user/change_level'
  end
end