'use strict';

const router = require('../router.js');
const api = require('../api.js');
const uri = require('../util/uri.js');
const User = require('../models/user.js');
const topNavigation = require('../models/top_navigation.js');
const RegistrationView = require('../views/registration_view.js');
const EmptyView = require('../views/empty_view.js');

class UserRegistrationController {
    constructor() {
        if (!api.hasPrivilege('users:create:self')) {
            this._view = new EmptyView();
            this._view.showError('Registration is closed.');
            return;
        }

        topNavigation.activate('register');
        topNavigation.setTitle('Registration');
        this._view = new RegistrationView();
        this._view.addEventListener('submit', e => this._evtRegister(e));
    }

    _evtRegister(e) {
        this._view.clearMessages();
        this._view.disableForm();
        const user = new User();
        user.name = e.detail.name;
        user.email = e.detail.email;
        user.password = e.detail.password;
        const isLoggedIn = api.isLoggedIn();
        user.save().then(() => {
            if (isLoggedIn) {
                return Promise.resolve();
            } else {
                api.forget();
                return api.login(e.detail.name, e.detail.password, false);
            }
        }).then(() => {
            if (isLoggedIn) {
                const ctx = router.show(uri.formatClientLink('users'));
                ctx.controller.showSuccess('User added!');
            } else {
                const ctx = router.show(uri.formatClientLink());
                ctx.controller.showSuccess('Welcome aboard!');
            }
        }, error => {
            this._view.showError(error.message);
            this._view.enableForm();
        });
    }
}

module.exports = router => {
    router.enter(['register'], (ctx, next) => {
        new UserRegistrationController();
    });
};