"use strict";

const router = require("../router.js");
const api = require("../api.js");
const uri = require("../util/uri.js");
const topNavigation = require("../models/top_navigation.js");
const PasswordResetView = require("../views/password_reset_view.js");

class PasswordResetController {
    constructor() {
        topNavigation.activate("login");
        topNavigation.setTitle("Password reminder");

        this._passwordResetView = new PasswordResetView();
        this._passwordResetView.addEventListener("submit", (e) =>
            this._evtReset(e)
        );
    }

    _evtReset(e) {
        this._passwordResetView.clearMessages();
        this._passwordResetView.disableForm();
        api.forget();
        api.logout();
        api.get(
            uri.formatApiLink("password-reset", e.detail.userNameOrEmail)
        ).then(
            () => {
                this._passwordResetView.showSuccess(
                    "E-mail has been sent. To finish the procedure, " +
                        "please click the link it contains."
                );
            },
            (error) => {
                this._passwordResetView.showError(error.message);
                this._passwordResetView.enableForm();
            }
        );
    }
}

class PasswordResetFinishController {
    constructor(name, token) {
        api.forget();
        api.logout();
        let password = null;
        api.post(uri.formatApiLink("password-reset", name), { token: token })
            .then((response) => {
                password = response.password;
                return api.login(name, password, false);
            })
            .then(
                () => {
                    const ctx = router.show(uri.formatClientLink());
                    ctx.controller.showSuccess("New password: " + password);
                },
                (error) => {
                    const ctx = router.show(uri.formatClientLink());
                    ctx.controller.showError(error.message);
                }
            );
    }
}

module.exports = (router) => {
    router.enter(["password-reset"], (ctx, next) => {
        ctx.controller = new PasswordResetController();
    });
    router.enter(["password-reset", ":descriptor"], (ctx, next) => {
        const [name, token] = ctx.parameters.descriptor.split(":", 2);
        ctx.controller = new PasswordResetFinishController(name, token);
    });
};