module.exports = {
    friendlyName: "Find",

    description: "Find Eleves Classe Notes.",

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

        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 {
            return exits.notFound({ message: "Vous n'etes pas autoriser a 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: "nom ASC",
        };


        let elevesClasses = await sails.helpers
            .paginator(AttributionClasse, cond, options)
            .then(async (elevesClasses) => {
                elevesClasses.data = await Promise.all(
                    elevesClasses.data.map(async (eleve) => {
                        if (eleve.codeClasse) {
                            eleve.classe = await Classe.find({ codeClasse: eleve.codeClasse }).then(_.first);
                        }
                        if (eleve.matricule) {
                            eleve.eleve = await Eleves.find({ matricule: eleve.matricule, }).then(_.first);
                        }

                        // 1. Récupérer TOUS les en-têtes de notes pour cet élève
                        const profNotes = await ProfNote.find({
                            //matricule: eleve.matricule,
                            codeClasse: eleve.codeClasse,
                            anneeScolaire: inputs.anneeScolaire,
                            codeEcole: inputs.codeEcole,
                            codeMatiere: inputs.codeMatiere,
                            trimSem: inputs.trimSem
                        });

                        // 2. Pour chaque en-tête, récupérer les détails
                       // console.log('NOTE', eleve.matricule, eleve.codeClasse, inputs.codeMatiere, inputs.anneeScolaire, eleve.codeEcole, inputs.trimSem)
                        const notesDetails = await ProfNoteDetails.find({
                            matricule: eleve.matricule,
                            codeClasse: eleve.codeClasse,
                            codeMatiere: inputs.codeMatiere,
                            anneeScolaire: inputs.anneeScolaire,
                            trimSem: inputs.trimSem,
                            codeEcole: eleve.codeEcole,

                        });
                        // 3. Création manuelle d'un map des en-têtes (remplace _.keyBy)
                        const profNotesMap = {};
                        profNotes.forEach(note => {
                            profNotesMap[note.codMoy] = note;
                        });

                        // 4. Transformation des notes
                        const transformNotes = (type) => {
                            // Trouver l'en-tête correspondant au type
                            const noteHeader = profNotes.find(p => p.typeNote === type);
                            if (!noteHeader) return null;

                            // Trouver le détail correspondant
                            const noteDetail = notesDetails.find(n => n.codMoy === noteHeader.codMoy);
                            if (!noteDetail) return null;

                            return {
                                note: noteDetail.note,
                                dateEvaluation: noteDetail.dateEvaluation,
                                coef: noteDetail.coef,
                                codMoy: noteDetail.codMoy,
                                status: noteDetail.status,
                                libDevoir: noteHeader.libDevoir,
                                typeNote: noteHeader.typeNote,
                                validation: noteHeader.validation,
                                
                            };
                        };

                        // Assignation des notes
                        eleve.I1 = transformNotes('I1');
                        eleve.I2 = transformNotes('I2');
                        eleve.I3 = transformNotes('I3');
                        eleve.I4 = transformNotes('I4');
                        eleve.I5 = transformNotes('I5');
                        eleve.D1 = transformNotes('D1');
                        eleve.D2 = transformNotes('D2');

                        /*// Organiser les notes par type (I1, I2, etc.)
                        eleve.notesParType = {
                            I1: notesDetails.filter(n => n.typeNote === 'I1'),
                            I2: notesDetails.filter(n => n.typeNote === 'I2'),
                            I3: notesDetails.filter(n => n.typeNote === 'I3'),
                            I4: notesDetails.filter(n => n.typeNote === 'I4'),
                            I5: notesDetails.filter(n => n.typeNote === 'I5'),
                            D1: notesDetails.filter(n => n.typeNote === 'D1'),
                            D2: notesDetails.filter(n => n.typeNote === 'D2')
                        };*/

                        return eleve
                    })
                );
                return elevesClasses
            });



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