module.exports = {
    friendlyName: "Notes Validation Status",
    description: "Retourne le statut de validation des notes pour chaque classe d'un trimestre.",
    inputs: {
        trimestre: { type: 'string', required: true },
        anneeScolaire: { type: 'string', required: true }, // optionnel, sinon année courante
        codeEcole: { type: 'string' }, // optionnel, sinon celui de l'utilisateur
    },
    exits: {
        success: { responseType: 'ok' },
        notFound: { responseType: 'notFound' },
        serverError: { responseType: 'serverError' },
    },
    fn: async function (inputs, exits) {
        console.log("inputs", inputs);
        try {
            const { user } = this.req.token;
            const codeEcole = inputs.codeEcole || user.codeEcole;
            const anneeScolaire = inputs.anneeScolaire || new Date().getFullYear().toString();
            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!" })

            }
            // 1. Récupérer toutes les classes de l'école
            const classes = await Classe.find({ codeEcole });

            // 2. Filtrer les classes pour exclure celles avec cycle 4 et 3
            const classesFiltrees = [];
            for (let classe of classes) {
                try {
                    const classeUniteScolaire = await ClasseUniteScolaire.findOne({
                        codeClasse: classe.codeClasse,
                        codeEcole: classe.codeEcole
                    });

                    if (classeUniteScolaire) {
                        classe.cycle = classeUniteScolaire.cycle;
                        // Exclure les classes avec cycle 4 (primaire) et 3 (maternelle)
                        if (classeUniteScolaire.cycle !== '4' && classeUniteScolaire.cycle !== '3') {
                            classesFiltrees.push(classe);
                        }
                    } else {
                        classe.cycle = null;
                        // Inclure les classes sans cycle défini
                        classesFiltrees.push(classe);
                    }
                } catch (error) {
                    console.error('Erreur lors de la récupération du cycle pour la classe:', classe.codeClasse, error);
                    classe.cycle = null;
                    // Inclure les classes en cas d'erreur
                    classesFiltrees.push(classe);
                }
            }

            // 3. Pour chaque classe filtrée, compter élèves et matières, vérifier validation
            let allValidated = true;
            // console.log("anneeScolaire", anneeScolaire);

            const result = await Promise.all(classesFiltrees.map(async (classe) => {
                // console.log("classe", classe);

                // Nombre d'élèves
                const nbEleves = await AttributionClasse.count({ codeClasse: classe.codeClasse, codeEcole, trimSem: inputs.trimestre, anneeScolaire });
                // Nombre de matières AttributionMatiere / , trimSem: inputs.trimestre 
                const nbMatieres = await AttributionMatiere.count({ codeClasse: classe.codeClasse, codeEcole, anneeScolaire });
                // Vérifier validation : toutes les entêtes doivent être validées
                const totalEntetes = await ProfNote.count({ codeClasse: classe.codeClasse, codeEcole, trimSem: inputs.trimestre, anneeScolaire });
                const validatedEntetes = await ProfNote.count({ codeClasse: classe.codeClasse, codeEcole, trimSem: inputs.trimestre, anneeScolaire, validation: 'OUI' });
                const resteAValider = totalEntetes - validatedEntetes;
                // Une classe sans entête est considérée comme validée
                const validated = (totalEntetes === 0) ? true : (validatedEntetes === totalEntetes);
                if (!validated) allValidated = false;
                return {
                    codeClasse: classe.codeClasse,
                    libelleClasse: classe.libelleClasse,
                    cycle: classe.cycle,
                    nbEleves,
                    nbMatieres,
                    nbEvaluations: totalEntetes,
                    nbValidees: validatedEntetes,
                    nbRestantAValider: resteAValider,
                    validated
                };
            }));
            console.log("result", result);
            return exits.success({ classes: result, allValidated });
        } catch (e) {
            return exits.serverError({ message: e.message });
        }
    }
}; 