module.exports = {
    friendlyName: "Find",

    description: "Find Information Parent Eleve.",

    inputs: {
        search: {
            type: "string",
        },
        qui: {
            type: "string",
        },
        codeClasse: {
            type: "string",
        },
        anneeScolaire: {
            type: "string",
        },
    },

    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)
        console.log("INPUTS", inputs)
        console.log("user", user)
        // 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!" })
        }
        console.log("user.codeEcole", user.codeEcole)
        ecoleVerif = await Ecoles.find({ codeEcole: user.codeEcole }).then(_.first)
        if (!ecoleVerif) {
            return exits.notFound({ message: "Cet utilisateur n'est attribué a aucune classe!" })
        }
        console.log("ecoleVerif", ecoleVerif)
        // 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!" })
        }
        ///aFIN

        if (inputs.codeClasse === '' || inputs.codeClasse === null || inputs.codeClasse === undefined) {
            inputs.codeClasse = undefined
        }

        //// FIN

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

        let userCodeEcole;
        // Je definir le tableau pour le code de la classe des enfants du parents
        let parentElevesClasseCode = [''];
        let qui = '';

        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 eleve = await Eleves.find({ nom: user.nom }).then(_.first)
            if (eleve) {
                user.codeUser = eleve.matricule
                inputs.matricule = eleve.matricule
            } else {
                return exits.notFound({ message: "Veuillez inscrire cet eleve dans la base!" })

            }
            //////// RECHERCHER LA CLASSE DE L'ELEVE
            let classe = await AttributionClasse.find({
                codeEcole: userCodeEcole,
                matricule: eleve.matricule,
                anneeScolaire: inputs.anneeScolaire ? inputs.anneeScolaire : undefined,
            }).then(_.first);

            if (classe) {
                parentElevesClasseCode.push(classe.codeClasse)
            }
            //console.log("classe elv", classe)

            ///POUR UN ELEVE
            qui = 'ELEVES'


        } else if (user.typeUser === 'PARENT') {

            userCodeEcole = user.codeEcole

            // JE VAIS CHERCHER LE PARENT ET JE REMPLACE SON CODE USER PAR SON CODEPARENT POUR LA SUITE DES OPERATION
            let parent = await Parents.find({ nom: user.nom, codeEcole: userCodeEcole, }).then(_.first)
            if (parent) {
                user.codeUser = parent.codeParent
                inputs.codeParent = parent.codeParent
            } else {
                return exits.notFound({ message: "Vous n'etes pas autoriser a accéder a cette page dans la base!" })
            }


            //////// RECHERCHER LES ELEVES DE CE PARRENT LA CLASSE DE L'ELEVE
            // JE CHERCHE LES ELEVES LIES A CE PARENT
            let filiations = await Filiation.find({ codeParent: parent.codeParent, codeEcole: userCodeEcole, })
                .then(filiations => {
                    return Promise.all(filiations.map(async filiation => {
                        //console.log('matieres', matieres)

                        let classeCode = await AttributionClasse.find({
                            codeEcole: userCodeEcole,
                            anneeScolaire: inputs.anneeScolaire ? inputs.anneeScolaire : undefined,
                            //trimSem: inputs.trimSem,
                            matricule: filiation.matricule
                        }).then(_.first)
                        // je renvoi le code de la classe dans le tableau de filtre
                        if (classeCode) {
                            parentElevesClasseCode.push(classeCode.codeClasse)
                        }

                        return filiation
                    })
                    );

                })
            // POUR UN PARENT
            qui = 'PARENTS'


        } else {
            return exits.notFound({ message: "Vous n'etes pas autoriser a accéder a cette page!" })

        }

        console.log('parentElevesClasseCode', parentElevesClasseCode)

        // RECHERCHE DES DONNEES

        let fixedAttr = ["codeEcole", "codeClasse", "anneeScolaire", "qui",];


        let cond = {
            codeEcole: userCodeEcole,
            codeClasse: parentElevesClasseCode,
            anneeScolaire: inputs.anneeScolaire ? inputs.anneeScolaire : undefined,
            qui: qui,
            //dateQuittance: {'>=':inputs.startDate,'<=':inputs.endDate},

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

        let options = {
            ...this.req.query,
            fixCond: _.pick(cond, fixedAttr),
            sort: "id DESC",
        };


        let informations = await sails.helpers
            .paginator(InformationsUser, cond, options)
            .then(async (informations) => {
                informations.data = await Promise.all(
                    informations.data.map(async (information) => {
                        if (information.codeClasse) {
                            information.classe = await Classe.find({ codeClasse: information.codeClasse }).then(_.first);
                        }
                        return information
                    })
                );
                return informations
            });

        // All done.
        return exits.success(informations);
        //console.log("userCodeEcole", userCodeEcole)


    },
};
