Source: controllers/restaurar.js

import { Rest } from "../services/rest.js";

/**
 * Se encarga de gestionar que se pueda dar de alta una nueva contraseña.
 * Y de darla de alta de ser así. 
 */
class Restaurar {
    constructor() {
        window.onload = this.iniciar.bind(this);
        window.onerror = (error) => console.error('Error capturado. ' + error);
    }

    /**
     * Inicia al cargar la página.
     */
    iniciar() {
        this.idUsuario = null;

        this.form = document.getElementsByTagName('form')[0];
        this.campo1 = document.getElementsByTagName('input')[0];
        this.campo2 = document.getElementsByTagName('input')[1];
        this.btnCancelar = document.getElementsByTagName('button')[0];
        this.btnAceptar = document.getElementsByTagName('button')[1];
        this.divExito = document.getElementById('divExito');
        this.divError = document.getElementById('divError');
        this.divCargando = document.getElementById('loadingImg');

        this.btnCancelar.addEventListener('click', this.redireccionar.bind(this));
        this.btnAceptar.addEventListener('click', this.validar.bind(this));
        this.validarCodigo();
    }

    /**
     * Comprobar si se puede restaurar la contraseña o no.
     */
    validarCodigo() {
        let path = window.location.search.substring(1, 7);  // Obtener el nombre solamente (codigo)
        let query = window.location.search.substring(8);   // Obtener el ID sin la parte de "?codigo="

        Rest.get('restaurar', [path], [query])
         .then(id => {
             this.idUsuario = id;
             this.btnAceptar.disabled = false;
         })
         .catch(e => {
             this.error(e, true);
         })
    }

    /**
     * Comprueba que las contraseñas sean correctas y comienza el proceso.
     */
    validar() {
        this.campo2.setCustomValidity('');
        this.form.classList.add('was-validated');

        if (this.campo1.checkValidity() && this.campo2.checkValidity()) {
            if (this.campo1.value == this.campo2.value) {
                
                this.divCargando.style.display = 'block';
                this.actualizarClave(this.idUsuario);
            }
            else {
                this.campo2.setCustomValidity('Las contraseñas no coindicen.');
                this.campo2.reportValidity();
            }
        }
    }

    /**
     * Realiza petición para actualiza la contraseña.
     * @param {Number} id ID del usuario.
     */
    actualizarClave(id) {
        const datos = {
            'id' : id,
            'clave' : this.campo1.value
        };

        Rest.put('restaurar', [], datos, false)
         .then(() => {
             this.exito();
         })
         .catch(e => {
             this.error(e, false);
         })
    }

    /**
     * Informa al usuario del éxito del proceso y redirige.
     */
    exito() {
        this.divCargando.style.display = 'none';
        this.divError.style.display = 'none';
        this.divExito.style.display = 'block';

        this.bloquearForm();

        window.scrollTo(0, document.body.scrollHeight);
        setTimeout(this.redireccionar.bind(this), 3000);
    }

    /**
     * Redirecciona a página de login de padres.
     */
    redireccionar() {
        window.location.href = 'login.html'
    }

    /**
     * Informa al usuario del error que ha ocurrido.
     * @param {Object} e Error.
     * @param {Boolean} bloquear Si es true, bloqueará los campos y el botón de enviar.
     */
    error(e, bloquear) {
        this.divCargando.style.display = 'none';

        if (bloquear)
            this.bloquearForm();

        if (e != null) {
            if (e == 'Error: 400 - Bad Request 1') {
                this.divError.innerHTML = '<p>No has solicitado un cambio de contraseña.</p>';
            }
            else if (e == 'Error: 400 - Bad Request 2') {
                this.divError.innerHTML = '<p>No se encuentra su solicitud de cambio de contraseña. Solicite un nuevo <a href="recuperar.html" class="link-light">cambio de contraseña</a>.</p>';
            }
            else if (e == 'Error: 400 - Bad Request 3') {
                this.divError.innerHTML = '<p>Su solicitud de cambio de contraseña no es válida. Solicite un nuevo <a href="recuperar.html" class="link-light">cambio de contraseña</a>.</p>';
            }
            else if (e == 'Error: 400 - Bad Request 4') {
                this.divError.innerHTML = '<p>Su solicitud de cambio de contraseña ha expirado. Solicite un nuevo <a href="recuperar.html" class="link-light">cambio de contraseña</a>.</p>';
            }
            else {
                this.divError.innerHTML = '<p>' + e + '</p>';
            }

            this.divError.style.display = 'block';
            this.form.classList.remove('was-validated');
            window.scrollTo(0, document.body.scrollHeight);
        }
        else {
            this.divError.style.display = 'none';
        }
    }

    /**
     * Desactiva los campos y botones del formulario.
     */
    bloquearForm() {
        this.campo1.disabled = true;
        this.campo2.disabled = true;
        this.btnAceptar.disabled = true;
    }
}

new Restaurar();