module.exports = {
    friendlyName: "Update Eleve Notes",
    description: "Mettre à jour les notes d'un élève",

    inputs: {
        matricule: {
            type: "string",
            required: true
        },
        codeClasse: {
            type: "string",
            required: true
        },
        anneeScolaire: {
            type: "string",
            required: true
        },
        codeEcole: {
            type: "string",
            required: true
        },
        trimSem: {
            type: "string",
            required: true
        },
        codMoy: {
            type: "string",
            required: true
        },
        typeNote: {
            type: "string",
            required: true
        },
        note: {
            type: "number",
            allowNull: true
        },
        status: {
            type: "string",
            isIn: ['PRESENT', 'ABSCENT'],
            required: true
        },
        codeMatiere: {
            type: "string",
            required: true
        }
    },

    exits: {
        success: {
            responseType: "ok",
            description: "Mise à jour réussie"
        },
        notFound: {
            responseType: "notFound",
            description: "Enregistrement non trouvé"
        },
        serverError: {
            responseType: "serverError",
            description: "Erreur serveur"
        },
        invalidRequest: {
            responseType: "invalid",
            description: "Requête invalide"
        }
    },

    fn: async function (inputs, exits) {
        console.log('INPUTS', inputs)

        try {
            // Vérification des permissions
            const { user } = this.req.token;
            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!" })

            }

            if (inputs.note !== null && (inputs.note < 0 || inputs.note > 20)) {
                return exits.invalidRequest({
                    success: false,
                    message: "La note doit être comprise entre 0 et 20"
                });
            }

            if (user.codeEcole !== inputs.codeEcole && (user.typeUser !== 'ADMIN' || user.typeUser !== 'ADMINISTRATION' || user.typeUser !== 'ENSEIGNANT')) {
                return exits.invalidRequest({
                    message: "Vous n'avez pas les droits pour modifier ces notes"
                });
            }

            // 1. Vérifier si ProfNote existe
            const profNote = await ProfNote.findOne({
                codeClasse: inputs.codeClasse,
                anneeScolaire: inputs.anneeScolaire,
                codeEcole: inputs.codeEcole,
                codeMatiere: inputs.codeMatiere,
                trimSem: inputs.trimSem,
                codMoy: inputs.codMoy,
                typeNote: inputs.typeNote
            });

            if (!profNote) {
                return exits.notFound({
                    success: false,
                    message: "L'en-tête de note n'existe pas"
                });
            }

            // 2. Rechercher la note existante dans ProfNoteDetails
            const existingNote = await ProfNoteDetails.findOne({
                matricule: inputs.matricule,
                codeClasse: inputs.codeClasse,
                codeMatiere: inputs.codeMatiere,
                anneeScolaire: inputs.anneeScolaire,
                trimSem: inputs.trimSem,
                codeEcole: inputs.codeEcole,
                codMoy: inputs.codMoy
            });

            // 3. Mettre à jour ou créer la note
            let updatedNote;
            const noteData = {
                ///matricule: inputs.matricule,
                //codeClasse: inputs.codeClasse,
                //codeMatiere: inputs.codeMatiere,
                //anneeScolaire: inputs.anneeScolaire,
                //trimSem: inputs.trimSem,
                // codeEcole: inputs.codeEcole,
                // codMoy: inputs.codMoy,
                //typeNote: inputs.typeNote,
                note: inputs.note,
                status: inputs.status,
                //updatedBy: user.id,
                updatedAt: new Date().getTime()
            };
            const newNoteData = {
                matricule: inputs.matricule,
                codeClasse: inputs.codeClasse,
                codeMatiere: inputs.codeMatiere,
                anneeScolaire: inputs.anneeScolaire,
                trimSem: inputs.trimSem,
                codeEcole: inputs.codeEcole,
                codMoy: inputs.codMoy,
                typeNote: inputs.typeNote,
                note: inputs.note,
                status: inputs.status,
                codeEnseignant: user.id,
                updatedAt: new Date().getTime()
            };

            if (existingNote) {
                // Mise à jour de la note existante
                updatedNote = await ProfNoteDetails.updateOne({ id: existingNote.id })
                    .set(noteData);
            } else {
                // Création d'une nouvelle note
                noteData.createdBy = user.id;
                noteData.createdAt = new Date().getTime();
                updatedNote = await ProfNoteDetails.create(newNoteData).fetch();
            }

            sails.log.info(`Note mise à jour pour l'élève ${inputs.matricule}`, {
                status: inputs.status,
                matiere: inputs.codeMatiere,
                typeNote: inputs.typeNote,
                previousNote: existingNote?.note,
                newNote: inputs.note
            });
            // 4. Retourner la réponse
            return exits.success({
                success: true,
                message: "Note mise à jour avec succès",
                data: updatedNote
            });



        } catch (error) {
            sails.log.error("Erreur lors de la mise à jour de la note:", error);
            return exits.serverError({
                success: false,
                message: "Une erreur est survenue lors de la mise à jour",
                error: error.message
            });
        }
    }
};