Source: controllers/padres.js

import { Modelo } from "../models/modelo.js";
import { VistaInicioPadres } from "../views/padres/vistainicio.js";
import { VistaMenuPadres } from "../views/padres/vistamenu.js";
import { VistaGestionHijos } from "../views/padres/vistagestionhijos.js";
import { VistaModificarPadres } from "../views/padres/vistamodificar.js";
import { Rest } from "../services/rest.js";

/**
 * Controlador del panel de padres.
 */
class ControladorPadres {
    #usuario = null; // Usuario logueado.

    constructor() {
        window.onload = this.iniciar.bind(this);
        window.onerror = (error) => console.error('Error capturado. ' + error);
    }

    /**
     * Inicia la aplicación.
     */
    iniciar() {
        this.#usuario = JSON.parse(sessionStorage.getItem('usuario'));

        // Comprobar login
        if (!this.#usuario)
            window.location.href = 'login.html';

        // Comprobar rol de usuario padre
        if (this.#usuario.rol != 'P')
            window.location.href = 'login.html';

        Rest.setAutorizacion(this.#usuario.autorizacion);

        this.modelo = new Modelo();
        this.vistaMenu = new VistaMenuPadres(this, document.getElementById('menuPadres'));
        this.vistaInicio = new VistaInicioPadres(this, document.getElementById('inicioPadres'));
        this.vistaGestionHijos = new VistaGestionHijos(this, document.getElementById('gestionHijosPadres'));
        this.vistaModificacion = new VistaModificarPadres(this, document.getElementById('modificacionPadres'));
        
        this.vistaModificacion.actualizarCampos(this.#usuario);
        this.vistaGestionHijos.actualizar(this.#usuario);
        this.vistaInicio.obtenerPadre(this.#usuario);
        this.verVistaInicio();
    }

    /**
     * Devuelve array de días festivos a vista de gestión de hijos.
     */
    obtenerFestivos(inicioMes, finMes) {
        this.modelo.obtenerFestivos(inicioMes, finMes)
         .then(festivos => {
             this.vistaInicio.obtenerFestivos(festivos);
         })
         .catch(e => {
             console.error(e);
         })
    }

    /**
     * Devuelve array de cursos a vista de gestión de hijos.
     */
    obtenerCursos() {
        this.modelo.obtenerCursos()
         .then(cursos => {
             this.vistaGestionHijos.rellenarSelects(cursos);
         })
         .catch(e => {
             console.error(e);
         })
    }

    /**
     * Cambia a la vista de inicio.
     */
    verVistaInicio() {
        this.vistaInicio.mostrar(true);
        this.vistaGestionHijos.mostrar(false);
        this.vistaModificacion.mostrar(false);
    }

    /**
     * Cambia a la vista de gestión de hijos.
     */
    verVistaGestionHijos() {
        this.vistaInicio.mostrar(false);
        this.vistaGestionHijos.mostrar(true);
        this.vistaModificacion.mostrar(false);
    }

    /**
     * Cambia a la vista de modificación de datos personales.
     */
    verVistaModificacion() {
        this.vistaInicio.mostrar(false);
        this.vistaGestionHijos.mostrar(false);
        this.vistaModificacion.mostrar(true);
    }

    /**
     * Registra un hijo existente a un padre mediante un PIN.
     * @param {Object} datos Datos.
     */
    registrarHijoPin(datos) {
        this.modelo.registrarHijoPin(datos)
         .then(() => {
             this.vistaGestionHijos.bloquearBotonesAlta(false);
             this.vistaGestionHijos.exitoAltaPin(true);
             this.dameHijos(this.#usuario.id); // Actualizar listado hijos.
         })
         .catch(e => {
             this.vistaGestionHijos.bloquearBotonesAlta(false);
             this.vistaGestionHijos.errorAltaPin(e);
             console.error(e);
         })
    }

    /**
     * Realiza el proceso de dar de alta a un hijo.
     * @param {Object} datos Datos del hijo.
     */
    altaHijo(datos) {
        this.modelo.altaHijo(datos)
         .then(() => {
             this.vistaGestionHijos.bloquearBotonesAlta(false);
             this.vistaGestionHijos.exitoAlta(true);
             this.dameHijos(this.#usuario.id); // Actualizar listado hijos.
         })
         .catch(e => {
             this.vistaGestionHijos.bloquearBotonesAlta(false);
             console.error(e);
         })
    }

    /**
     * Modificar datos de un hijo.
     * @param {Object} datos 
     */
    modificarHijo(datos){
        this.modelo.modificarHijo(datos)
         .then(() => {
             this.vistaGestionHijos.btnActualizar.disabled = false;
             this.vistaGestionHijos.btnCancelarMod.disabled = false;
             this.vistaGestionHijos.exitoModificacion(true);
             this.dameHijos(this.#usuario.id); // Actualizar listado hijos.
         })
         .catch(e => {
             this.vistaGestionHijos.btnActualizar.disabled = false;
             this.vistaGestionHijos.btnCancelarMod.disabled = false;
             console.error(e);
         }) 
    }

    /**
     * Elimina relación padre-hijo.
     * @param {Number} id ID del hijo.
     */
    eliminarRelacionHijo(id) {
        this.modelo.eliminarRelacionHijo(id, this.#usuario.id)
         .then(() => {
             this.dameHijos(this.#usuario.id); // Actualizar listado hijos.
         })
         .catch(e => {
             console.error(e);
         })
    }

    /**
     * Realizar la eliminación de un hijo.
     * @param {Number} id ID del hijo.
     */
    eliminarHijo(id){
        this.modelo.eliminarHijo(id)
         .then(() => {
             this.dameHijos(this.#usuario.id); // Actualizar listado hijos.
         })
         .catch(e => {
             console.error(e);
         })
    }

    /**
     * Marca día del comedor.
     * @param {Object} datos Datos del día a marcar.
     */
    marcarDiaComedor(datos) {
        this.modelo.marcarDiaComedor(datos)
         .catch(e => {
             console.error(e)
         })
    }

    /**
     * Obtiene los días de comedor de los hijos.
     * @param {Array} idHijos Array con los IDs de los hijos.
     */
    obtenerDiasComedor(idHijos) {
        this.modelo.obtenerDiasComedor(idHijos)
         .then(dias => {
            this.vistaInicio.montarCalendario(dias);
         })
         .catch(e => {
             console.error(e);
         })
    }

    /**
     * Desmarcar día del comedor.
     * @param {Object} datos Datos del día.
     */
    desmarcarDiaComedor(datos) {
        this.modelo.desmarcarDiaComedor(datos)
         .catch(e => {
             console.error(e)
         })
    }

    /**
     * Cierra la sesión del usuario.
     */
    cerrarSesion() {
        this.#usuario = null;
        sessionStorage.removeItem('usuario');
        Rest.setAutorizacion(null);
        window.location.href = 'login.html';
    }

    /**
     * Realiza la modificación de los datos del padre.
     * @param {Object} datos Nuevos datos del padre.
     */
    modificarPadre(datos) {
        this.modelo.modificarPadre(datos)
         .then(() => {
             this.vistaModificacion.exito(true);
             sessionStorage.setItem('usuario', JSON.stringify(datos));
         })
         .catch(e => {
             this.vistaModificacion.errorModificacion(e);
             console.error(e);
         }) 
    }

    /**
     * Devuelve los hijos de un padre a la vista de inicio.
     * @param {Number} id ID del padre. 
     */
    dameHijosCalendario(id) {
        this.modelo.dameHijos(id)
         .then(hijos => {
             this.vistaInicio.inicializar(hijos);
         })
         .catch(e => {
             console.error(e)
         })
    }

    /**
     * Devuelve los hijos de un padre a la vista de gestión de hijos.
     * @param {Number} id ID del padre. 
     */
    dameHijos(id) {
        this.modelo.dameHijos(id)
         .then(hijos => {
             this.vistaGestionHijos.cargarListado(hijos);
         })
         .catch(e => {
             console.error(e)
         })
    }

    /**
     * Elimina cuenta de un padre.
     * @param {Number} id ID padre.
     */
    eliminarCuentaPadre(id) {
        this.modelo.borrarCuentaPadre(id)
         .then(() => {
             this.cerrarSesion();
         })
         .catch(e => {
             console.error(e);
             this.vistaModificacion.errorBorrado(e);
         })
    }
}

new ControladorPadres();