module.exports = {
    friendlyName: "Notes Mise Disposition Status",
    description: "Retourne le statut de mise à disposition des notes pour chaque classe d'un trimestre.",

    inputs: {
        trimestre: { type: 'string', required: true },
        anneeScolaire: { type: 'string', required: true }
    },

    exits: {
        success: { responseType: 'ok' },
        notFound: { responseType: 'notFound' },
        serverError: { responseType: 'serverError' },
    },

    fn: async function (inputs, exits) {
        try {
            const { user } = this.req.token;
            const codeEcole = user.codeEcole;
            const anneeScolaire = inputs.anneeScolaire;
            const trimestre = inputs.trimestre;

            // Vérification des permissions
            if (user.codeEcole === '' || user.codeEcole === null || user.codeEcole === undefined) {
                return exits.notFound({ message: "Veuillez préciser le code Ecole pour cet utilisateur pour accéder à cette page!" });
            }

            const ecoleVerif = await Ecoles.find({ codeEcole: user.codeEcole }).then(_.first);
            if (!ecoleVerif) {
                return exits.notFound({ message: "Cet utilisateur n'est attribué à aucune école!" });
            }

            // Vérification de l'année scolaire
            if (anneeScolaire === '' || anneeScolaire === null || anneeScolaire === undefined) {
                return exits.notFound({ message: "Veuillez préciser une année scolaire pour accéder à cette page!" });
            }

            // Vérification du trimestre
            if (trimestre === '' || trimestre === null || trimestre === undefined) {
                return exits.notFound({ message: "Veuillez préciser un trimestre pour accéder à cette page!" });
            }

            // Vérification des permissions utilisateur
            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'êtes pas autorisé à accéder à cette page!" });
            }

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

            // 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, vérifier le statut de mise à disposition
            let allNotesDisponibles = true;
            const result = await Promise.all(classesFiltrees.map(async (classe) => {
                try {
                    // Récupérer toutes les entêtes de notes pour cette classe
                    const totalEntetes = await ProfNote.count({
                        codeClasse: classe.codeClasse,
                        codeEcole: classe.codeEcole,
                        trimSem: trimestre,
                        anneeScolaire: anneeScolaire
                    });

                    // Récupérer les entêtes avec etatNote = 'OUI'
                    const entetesDisponibles = await ProfNote.count({
                        codeClasse: classe.codeClasse,
                        codeEcole: classe.codeEcole,
                        trimSem: trimestre,
                        anneeScolaire: anneeScolaire,
                        etatNote: 'OUI'
                    });

                    // Calculer le pourcentage de disponibilité
                    const pourcentageDisponibilite = totalEntetes > 0 ? (entetesDisponibles / totalEntetes) * 100 : 100;

                    // Déterminer le statut global
                    const statutDisponibilite = totalEntetes === 0 ? 'AUCUNE_NOTE' :
                        entetesDisponibles === totalEntetes ? 'COMPLET' :
                            entetesDisponibles > 0 ? 'PARTIEL' : 'AUCUNE';

                    // Mettre à jour le statut global
                    if (totalEntetes > 0 && entetesDisponibles < totalEntetes) {
                        allNotesDisponibles = false;
                    }

                    return {
                        success: true,
                        codeClasse: classe.codeClasse,
                        libelleClasse: classe.libelleClasse,
                        cycle: classe.cycle,
                        totalEntetes: totalEntetes,
                        entetesDisponibles: entetesDisponibles,
                        entetesEnAttente: totalEntetes - entetesDisponibles,
                        pourcentageDisponibilite: Math.round(pourcentageDisponibilite * 100) / 100,
                        statutDisponibilite: statutDisponibilite,
                        disponible: entetesDisponibles === totalEntetes
                    };
                } catch (error) {
                    console.error('Erreur lors du traitement de la classe:', classe.codeClasse, error);
                    return {
                        success: false,
                        codeClasse: classe.codeClasse,
                        libelleClasse: classe.libelleClasse,
                        cycle: classe.cycle,
                        totalEntetes: 0,
                        entetesDisponibles: 0,
                        entetesEnAttente: 0,
                        pourcentageDisponibilite: 0,
                        statutDisponibilite: 'ERREUR',
                        disponible: false
                    };
                }
            }));

            return exits.success({
                success: true,
                classes: result,
                allNotesDisponibles: allNotesDisponibles,
                trimestre: trimestre,
                anneeScolaire: anneeScolaire,
                totalClasses: result.length,
                classesDisponibles: result.filter(c => c.disponible).length,
                classesPartielles: result.filter(c => c.statutDisponibilite === 'PARTIEL').length
            });

        } catch (error) {
            console.error('Erreur dans notes-mise-disposition-status:', error);
            return exits.serverError({ success: false, message: error.message });
        }
    }
};
