module.exports = {
    friendlyName: "Find",

    description: "Find Eleves Parents.",

    inputs: {
        search: {
            type: "string",
        },
        trimSem: {
            type: "string",
            require: true
        },
        anneeScolaire: {
            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.nom)
        //console.log("ID", id, inputs.codeClasse, inputs.anneeScolaire, inputs.trimSem)

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

        let userCodeEcole;
        if (user.typeUser === 'PARENT') {
            userCodeEcole = user.codeEcole
        } else {
            return exits.notFound({ message: "Vous n'etes pas autoriser a accéder a cette page!" })

        }
        //console.log("userCodeEcole", userCodeEcole)

        //JE CHERCHE LE CODE PARENT DE L'UTILISATEUR QUI EST CONNECTER
        let parent = await Parents.find({ codeParent: user.codeUser,/* nom: user.nom,*/ codeEcole: userCodeEcole, }).then(_.first);
        if (!parent) {
            return exits.notFound({ message: "Vous n'etes pas autoriser a accéder a cette page!" })
        }
        // JE CHERCHER 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)

                    //JE VAIS CHERCHER LE NOM DE L'ELEVE
                    if (filiation.matricule) {
                        let eleve = await Eleves.find({ matricule: filiation.matricule, }).then(_.first);
                        filiation.eleve = eleve
                        filiation.nom = eleve.nom
                        filiation.prenom = eleve.prenom
                    }
                    // Je vais chercher le code classe de l'eleve pour l'année en cours et le trimestre 
                    //console.log("userCodeEcole", userCodeEcole)
                    //console.log("filiation.matricule", filiation.matricule, inputs.anneeScolaire, inputs.trimSem)

                    let classeCode = await AttributionClasse.find({
                        codeEcole: userCodeEcole,
                        anneeScolaire: inputs.anneeScolaire ? inputs.anneeScolaire : undefined,
                        trimSem: inputs.trimSem,
                        matricule: filiation.matricule
                    }).then(_.first)
                    //console.log("classeCode", classeCode)
                    // je vais chercher le nom de la classe de l'eleve
                    if (classeCode) {
                        let classe = await Classe.find({ codeClasse: classeCode.codeClasse }).then(_.first)
                        filiation.classe = classe
                        filiation.codeClasse = classe.codeClasse
                        filiation.libelleClasse = classe.libelleClasse

                        const cycle = await ClasseUniteScolaire.findOne({ codeClasse: classeCode.codeClasse });
                        if (cycle) {
                            filiation.cycle = cycle?.cycle;
                        } else {
                            filiation.cycle = '1';
                        }
                        //console.log("cycle", cycle)
                        // SI ON TROUVE LA CLASSE ALORS ON VA CHERCHER LE RESTE DES INFOS

                        // Je vais chercher la scolarité de l'eleve
                        let scolarite = await Scolarite.find({
                            codeEcole: userCodeEcole,
                            codeClasse: classeCode.codeClasse,
                            anneeScolaire: inputs.anneeScolaire ? inputs.anneeScolaire : undefined,
                            matricule: filiation.matricule
                        })
                            .then(scolarite => {
                                return Promise.all(scolarite.map(async scolar => {
                                    // console.log("scolar", userCodeEcole, scolar.anneeScolaire, scolar.matricule, scolar.codeClasse, scolar.codeNatureRecette, scolar.libelle)

                                    let paiement = await DetailsPaiement.find({
                                        codeEcole: userCodeEcole,
                                        anneeScolaire: scolar.anneeScolaire,
                                        matricule: scolar.matricule,
                                        codeClasse: scolar.codeClasse,
                                        //codeNatureRecette: scolar.codeNatureRecette,
                                        libelleNatureRecette: scolar.libelle,
                                    })//.then(_.first) CAR ON PEUT AVOIR PLUSIEURS PAIEMENTS
                                    //console.log("PAIEMENT", paiement)
                                    if (paiement) {
                                        scolar.paiement = paiement
                                    }
                                    return scolar
                                }));
                            })

                        // console.log("scolarite", scolarite)

                        if (scolarite) {
                            // Pour cette Scolarite, j'irai chercher les payement deja effecturer dans details paiement
                            filiation.scolarite = scolarite;

                        }

                        let quittances = await Quittance.find({
                            codeEcole: userCodeEcole,
                            codeClasse: classeCode.codeClasse,
                            anneeScolaire: inputs.anneeScolaire ? inputs.anneeScolaire : undefined,
                            matricule: filiation.matricule,
                        })
                        //console.log("quittances", quittances)

                        if (quittances) {
                            filiation.quittances = quittances

                        }

                    }


                    filiation.ecole = ecoleVerif

                    return filiation
                })
                );

            })

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