module.exports = {
    friendlyName: "Find Classe",

    description: "Find Emplois du Temps par classe.",

    inputs: {
        codeClasse: {
            type: "string",
            required: true
        },
        anneeScolaire: {
            type: "string",
            required: true
        }
    },

    exits: {
        notFound: {
            statusCode: 404
        }
    },

    fn: async function (inputs, exits) {
        const { id, user } = this.req.token;

        // VERIFICATION DU CODE ECOLE
        if (user.codeEcole === '' || user.codeEcole === null || user.codeEcole === undefined) {
            return exits.notFound({ message: "Veuillez préciser le code Ecole pour cet utilisateur pour accéder a cette page!" })
        }

        let ecoleVerif = await Ecoles.find({ codeEcole: user.codeEcole }).then(_.first)
        if (!ecoleVerif) {
            return exits.notFound({ message: "Cet utilisateur n'est attribué a aucune ecole!" })
        }

        // VERIFICATION SI ANNEE SCOLAIRE EST PASSEE
        if (inputs.anneeScolaire === '' || inputs.anneeScolaire === null || inputs.anneeScolaire === undefined) {
            return exits.notFound({ message: "Veuillez préciser une année scolaire pour accéder a cette page!" })
        }

        let userCodeEcole;
        if (user.typeUser === 'ADMINISTRATION' || user.typeUser === 'SECRETARIAT') {
            userCodeEcole = user.codeEcole
        } else if (user.typeUser === 'ADMIN') {
            userCodeEcole = undefined
        } else if (user.typeUser === 'PARENT') {
            userCodeEcole = user.codeEcole
        } else if (user.typeUser === 'ELEVE') {
            userCodeEcole = user.codeEcole

            // JE VAIS CHERCHER L'ELEVE ET JE REMPLACE SON CODE USER PAR SON MATRICULE POUR LA SUITE DES OPERATION
            let eleveMat = await Eleves.find({ nom: user.nom }).then(_.first)
            if (eleveMat) {
                user.codeUser = eleveMat.matricule
            } else {
                return exits.notFound({ message: "Veuillez inscrire cet eleve dans la base!" })
            }

            // GO chercher codeClasse ELEVE
            let classeEleve = await AttributionClasse.find({
                codeEcole: user.codeEcole,
                matricule: user.codeUser,
                anneeScolaire: inputs.anneeScolaire
            }).then(_.first);

            if (classeEleve) {
                inputs.codeClasse = classeEleve.codeClasse
            } else {
                return exits.notFound({ message: "Vous devez etre affecté a une classe pour accéder a cette page!" })
            }
        } else {
            return exits.notFound({ message: "Vous n'êtes pas autorisé à accéder a cette page!" })
        }

        // RECUPERATION DES EMPLOIS DU TEMPS PAR CLASSE
        let emplois = await EmploisDuTemps.find({
            codeEcole: userCodeEcole,
            codeClasse: inputs.codeClasse,
            anneeScolaire: inputs.anneeScolaire
        })
            .sort([
                { nomJour: 'ASC' },
                { heureDebut: 'ASC' }
            ])
            .then(emplois => {
                return Promise.all(emplois.map(async emploi => {
                    // Récupération des informations de la matière
                    let matiere = await AttributionMatiere.find({
                        codeClasse: inputs.codeClasse,
                        codeMatiere: emploi.codeMatiere
                    }).then(_.first)

                    if (matiere) {
                        emploi.libelleMatiere = matiere.libelleCourt
                    }

                    // Récupération des informations de l'enseignant
                    let enseignant = await Enseignants.find({
                        codeEnseignant: emploi.codeEnseignant
                    }).then(_.first)

                    if (enseignant) {
                        emploi.nomEnseignant = enseignant.nom
                        emploi.prenomEnseignant = enseignant.prenom
                    }

                    return emploi
                }))
            })

        // All done.
        return exits.success(emplois);
    },
}; 