module.exports = {
    friendlyName: "Find",

    description: "Find Eleves Classe.",

    inputs: {
        search: {
            type: "string",
        },
        trimSem: {
            type: "string",
            require: true
        },
        anneeScolaire: {
            type: "string",
            require: true
        },
        codeClasse: {
            type: "string",
            require: true
        },
        matricule: {
            type: "string",
            require: true
        }

    },

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

    fn: async function (inputs, exits) {
        const { id, user } = this.req.token;
        //console.log("ID", id, user.login, user.typeUser, user.codeEcole, user.codeUser, user.nom)
        //console.log("TEST1", inputs)

        // 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 utulisateur pour a accéder a cette page!" })
        }
        ecoleVerif = await Ecoles.find({ codeEcole: user.codeEcole }).then(_.first)
        if (!ecoleVerif) {
            return exits.notFound({ message: "Cet utilisateur n'est attribué a aucune ecole!" })
        }
        // FIN VERIF CODE ECOLE

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

        this.req.query.limit = this.req.query.limit || "10";
        this.req.query.skip = this.req.query.skip || "0";

        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') {
            // SI type user est ELEVE 
            userCodeEcole = user.codeEcole
            // Go chercher matricule ELEVE
            /* let eleve = await Eleves.find({ matricule: user.codeUser, }).then(_.first);
 
             if (!eleve) {
                 return exits.notFound({ message: "Vous devez posséder un numéro matricule pour accéder a cette page!" })
             }*/

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

            }
            //inputs.matricule = user.codeUser //eleve.matricule

            // GO chercher codeClasse ELEVE
            let classeEleve = await AttributionClasse.find({ codeEcole: user.codeEcole, matricule: user.codeUser /*eleve.matricule*/, trimSem: inputs.trimSem, 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'etes pas autoriser a accéder a cette page!" })

        }

        if (inputs.matricule === '' || inputs.matricule === null || inputs.matricule === undefined) {
            return exits.notFound({ message: "Veuillez préciser un matricule pour a accéder a cette page!" })
        }
        if (inputs.codeClasse === '' || inputs.codeClasse === null || inputs.codeClasse === undefined) {
            return exits.notFound({ message: "Vous devez etre affecté a une classe pour accéder a cette page!" })
        }
        //console.log("userCodeEcole", userCodeEcole)

        //let fixedAttr = ["codeEcole", "codeClasse", "anneeScolaire", "trimSem"];

        /*if(inputs.role === '' || inputs.role === undefined || inputs.role === null || inputs.role === 'undefined'){
            inputs.role = undefined
        }*/
        /*let cond = {
            codeEcole: userCodeEcole,
            codeClasse: inputs.codeClasse ? inputs.codeClasse : undefined,
            anneeScolaire: inputs.anneeScolaire ? inputs.anneeScolaire : undefined,
            trimSem: inputs.trimSem,

            or: [
                { matricule: { contains: inputs.search ? inputs.search.toUpperCase() : "" } },
                //{ libelle: { contains: inputs.search ? inputs.search.toUpperCase() : "" } },
                //{ nom: { contains: inputs.search ? inputs.search.toUpperCase() : "" } },
            ],
        };
        //console.log("cond", cond)

        let options = {
            ...this.req.query,
            fixCond: _.pick(cond, fixedAttr),
            sort: "rang ASC",
        };
*/
        /////////////////////////////////////////////////////
        let matieres = await AttributionMatiere.find({
            codeEcole: userCodeEcole,
            codeClasse: inputs.codeClasse,
            anneeScolaire: inputs.anneeScolaire
        })
            .sort('libelleLong ASC')
            .then(matieres => {
                return Promise.all(matieres.map(async matiere => {
                    //console.log('matieres', matieres)

                    /// JE VAIS CHERCHER LES NOTES LIEES A UNE MATIERE POUR l'ELEVE DONT LE CODE A ETE ENVOYER
                    let notes = await AttributionNoteMoyenne.find({
                        codeEcole: userCodeEcole,
                        matricule: inputs.matricule,
                        anneeScolaire: inputs.anneeScolaire,
                        typeNote: 'NOTE',
                        codeMatiere: matiere.codeMatiere,
                        trimSem: inputs.trimSem,
                        codeClasse: inputs.codeClasse,
                    })
                        .then(notes => {
                            return Promise.all(notes.map(async note => {
                                // JE VAIS CHERCHER LE TYPE DE NOTE ET LA DATE EVALUATION POUR CHAQUE NOTE
                                let ordreEvaluation = await OrdreEvaluation.find({
                                    codeMatiere: matiere.codeMatiere,
                                    codeEcole: userCodeEcole,
                                    codeClasse: inputs.codeClasse,
                                    trimSem: inputs.trimSem,
                                    anneeScolaire: inputs.anneeScolaire,
                                    codMoy: note.codMoy

                                }).then(_.first)

                                //if (ordreEvaluation) {
                                note.ordreEvaluation = ordreEvaluation
                                // }

                                return note
                            }))
                        })

                    // JE RETOURNE LA NOTES DANS LA MATIERE
                    if (notes) {
                        matiere.notes = notes
                    }
                    // JE VAIS MAINTENANT CHERCHER LA MOYENNE DE CETTE MATIERE
                    let moyenne = await AttributionNoteMoyenne.find({
                        codeEcole: userCodeEcole,
                        matricule: inputs.matricule,
                        anneeScolaire: inputs.anneeScolaire,
                        typeNote: 'MOYENNE',
                        codeMatiere: matiere.codeMatiere,
                        trimSem: inputs.trimSem,
                        codeClasse: inputs.codeClasse,
                    }).then(_.first)


                    if (moyenne) {
                        matiere.moyenne = moyenne
                    }
                    matiere.matricule = inputs.matricule


                    return matiere
                })
                );

            })
       // console.log("TEST1", matieres)

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