### codetube
    Copyright (C) 2011 payload payload@lavabit.com
    Copyright (C) 2011 dodo dodo.the.last@gmail.com

    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU Affero General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU Affero General Public License for more details.

    You should have received a copy of the GNU Affero General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>
###

async = require('async')
gt = require('gettext')
slug = require('../slug') # XXX not used
config = require('../config')
HelperRoutes = require('./main')
appconfig = require('../appconfig')
sha1 = require('../helper').hash('sha1')
Activity = require('../models/activity')
Model = require('../models/skeleton')
User = require('../models/user')
Controller = require('./skeleton')
forms = require('../forms')
db = require('../db')
{ debug_log } = require('../helper')

[router, routes] = [null, null]
process.nextTick ->
    router = require('../routes')
    routes = router.controller

μ = (next) -> next()

class Users extends Controller
    setting_form: (args...) =>
        routes.main.settings.apply(0, ['user'].concat(args))

    settings: (req, res) =>
        { user } = req
        unless user
            return routes.authentication.login(req, res)
        page = "#{req.params}"
        async.waterfall [((n)->n())
        ,(next) =>
            @setting_form req, res, page, user, user, (err, form) =>
                req.flash('error', err) if err
                if form._exists
                    if form.isValid()
                        data = form.clear_data
                        data = data.clean(user) if data.clean
                        user.set(data)
                        return user.save (err) =>
                            unless @db_failed(err, req)
                                req.flash('info', gt._("data saved"))
                            next(null, user, page, form)
                    else
                        req.flash('warn', gt._("invalid data"))
                next(null, user, page, form or null)
        ,(user, page, form, next) =>
            @render req, res, 'settings',
                url_prefix: "/#{user.id}/.settings/"
                page: page
                user: user
                form: form
        ], (err) =>
            @db_failed(err, req)
            @home(req, res)

    show: (req, res, next) =>
        { userid } = req.params
        unless userid
            return @render(req, res, "deadlink", error:"give me a userid")
        if userid == req.user?.id
            @render(req, res, "dashboard", { user: req.user })
        else
            User.fetch userid, (err, user) =>
                if err
                    @render(req, res, "deadlink", error:err)
                else
                    @render(req, res, "userpage", { user })

    list: (req, res) =>
        { skip, limit } = req.query
        User.list limit, skip, (err, users) =>
            return if @check_err(err, req, res)
            @render(req, res, 'userlist', { users })

    New: (req, res) =>
        req.form or= forms.register(req, res).bind(req.body)
        req.form.validate(() ->)
        user_form = req.form.clear_data(req).post_validate()
        unless req.form.isValid()
            return routes.authentication.register(req,res)
        User.fetch user_form.id, (err, user, objs) =>
            if err and err.code != "user not found"
                debug_log(err)
                req.flash("error", gt._("some error"))
                return routes.authentication.register(req, res)
            if user
                err = gt._("user allready registered")
                debug_log(err)
                req.flash("error", err)
                return routes.authentication.register(req, res)
            u = user_form.clean()
            user = new User
                id: u.id
                name: u.name
                passphrase: u.password
            user.save (err) =>
                unless err
                    req.flash("ok", gt._("registered successfully"))
                    routes.main.home(req, res)
                else
                    debug_log(err)
                    req.flash("error", gt._("some error"))
                    routes.authentication.register(req, res)

# exports

module.exports = Users

