module.exports = {
    friendlyName: "Notes Mise Disposition Publish",
    description: "Met en ligne les notes d'une classe en transférant les données vers DEVOIR et DET_MOY et met à jour etatNote à OUI.",

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

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

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

            // 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 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!" });
            }

            // Vérification que la classe existe
            const classe = await Classe.findOne({
                codeClasse: codeClasse,
                codeEcole: userCodeEcole || user.codeEcole
            });

            if (!classe) {
                return exits.notFound({ message: "Classe non trouvée!" });
            }

            // Récupérer toutes les entêtes de notes pour cette classe
            const entetesNotes = await ProfNote.find({
                codeClasse: codeClasse,
                codeEcole: userCodeEcole || user.codeEcole,
                trimSem: trimestre,
                anneeScolaire: anneeScolaire
            });

            if (!entetesNotes || entetesNotes.length === 0) {
                return exits.notFound({ message: "Aucune note trouvée pour cette classe, trimestre et année scolaire!" });
            }

            // Vérifier que toutes les notes sont validées avant la mise en ligne
            const notesNonValidees = entetesNotes.filter(entete => entete.validation !== 'OUI');
            if (notesNonValidees.length > 0) {
                return exits.invalidRequest({
                    message: `Impossible de mettre en ligne : ${notesNonValidees.length} note(s) non validée(s)`,
                    notesNonValidees: notesNonValidees.map(n => ({ codeMatiere: n.codeMatiere, typeNote: n.typeNote }))
                });
            }

            // Début de la transaction de mise en ligne
            let transfertReussi = 0;
            let transfertEchoue = 0;
            const erreurs = [];

            for (const entete of entetesNotes) {
                try {
                    // Récupérer les détails des notes pour cette entête
                    const detailsNotes = await ProfNoteDetails.find({
                        codMoy: entete.codMoy,
                        anneeScolaire: anneeScolaire
                    });

                    if (detailsNotes && detailsNotes.length > 0) {
                        // 1. Insérer dans DEVOIR (table d'affichage pour les parents)
                        const devoirData = {
                            codMoy: entete.codMoy,
                            codeEcole: entete.codeEcole,
                            codeClasse: entete.codeClasse,
                            codeMatiere: entete.codeMatiere,
                            typeNote: entete.typeNote,
                            trimSem: entete.trimSem,
                            anneeScolaire: entete.anneeScolaire,
                            coef: entete.coef || 1,
                            dateCreation: new Date(),
                            statut: 'ACTIF'
                        };

                        // Vérifier si l'enregistrement existe déjà dans DEVOIR
                        const devoirExistant = await DEVOIR.findOne({
                            codMoy: entete.codMoy,
                            codeEcole: entete.codeEcole,
                            codeMatiere: entete.codeMatiere,
                            typeNote: entete.typeNote,
                            trimSem: entete.trimSem,
                            anneeScolaire: anneeScolaire
                        });

                        if (!devoirExistant) {
                            await DEVOIR.create(devoirData);
                        }

                        // 2. Insérer dans DET_MOY (détails des moyennes pour les parents)
                        for (const detail of detailsNotes) {
                            const detMoyData = {
                                codMoy: detail.codMoy,
                                matricule: detail.matricule,
                                codeEcole: detail.codeEcole,
                                note: detail.note,
                                anneeScolaire: detail.anneeScolaire,
                                dateCreation: new Date(),
                                statut: 'ACTIF'
                            };

                            // Vérifier si l'enregistrement existe déjà dans DET_MOY
                            const detMoyExistant = await DET_MOY.findOne({
                                codMoy: detail.codMoy,
                                matricule: detail.matricule,
                                codeEcole: detail.codeEcole,
                                anneeScolaire: detail.anneeScolaire
                            });

                            if (!detMoyExistant) {
                                await DET_MOY.create(detMoyData);
                            }
                        }

                        // 3. Mettre à jour etatNote à 'OUI' dans ProfNote
                        await ProfNote.update({
                            codMoy: entete.codMoy,
                            codeEcole: entete.codeEcole,
                            codeMatiere: entete.codeMatiere,
                            typeNote: entete.typeNote,
                            trimSem: entete.trimSem,
                            anneeScolaire: entete.anneeScolaire
                        }).set({
                            etatNote: 'OUI',
                            dateMiseEnLigne: new Date(),
                            misEnLignePar: user.id
                        });

                        // 4. Mettre à jour etatNote à 'OUI' dans ProfNoteDetails
                        await ProfNoteDetails.update({
                            codMoy: entete.codMoy,
                            anneeScolaire: entete.anneeScolaire
                        }).set({
                            etatNote: 'OUI'
                        });

                        transfertReussi++;
                    }
                } catch (error) {
                    console.error(`Erreur lors du transfert pour l'entête ${entete.codMoy}:`, error);
                    transfertEchoue++;
                    erreurs.push({
                        codMoy: entete.codMoy,
                        codeMatiere: entete.codeMatiere,
                        typeNote: entete.typeNote,
                        erreur: error.message
                    });
                }
            }

            // Retourner le résumé de l'opération
            return exits.success({
                success: true,
                message: `Mise en ligne terminée pour la classe ${codeClasse}`,
                resume: {
                    totalEntetes: entetesNotes.length,
                    transfertReussi: transfertReussi,
                    transfertEchoue: transfertEchoue,
                    classe: codeClasse,
                    trimestre: trimestre,
                    anneeScolaire: anneeScolaire,
                    dateMiseEnLigne: new Date(),
                    misEnLignePar: user.id
                },
                erreurs: erreurs.length > 0 ? erreurs : null
            });

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