module.exports = {
    friendlyName: "Update",

    description: "Update Emplois du Temps par classe.",

    inputs: {
        id: {
            type: "number",
            required: true
        },
        codeMatiere: {
            type: "string",
            required: true
        },
        codeEnseignant: {
            type: "string",
            required: true
        },
        codeClasse: {
            type: "string",
            required: true
        },
        /*dateConfig: {
            type: "string",
            required: true
        },*/
        idJour: {
            type: "string",
            required: true
        },
        nomJour: {
            type: "string",
            required: true
        },
        heureDebut: {
            type: "string",
            required: true
        },
        heureFin: {
            type: "string",
            required: true
        },
        libelleClasse: {
            type: "string",
            required: true
        },
        anneeScolaire: {
            type: "string",
            required: true
        }
    },

    exits: {
        notFound: {
            statusCode: 404
        },
        badRequest: {
            statusCode: 400
        }
    },

    fn: async function (inputs, exits) {
        const { id, user } = this.req.token;

        // 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 utilisateur pour accéder a cette page!" })
        }

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

        // VERIFICATION DES PERMISSIONS
        if (user.typeUser !== 'ADMINISTRATION' && user.typeUser !== 'SECRETARIAT' && user.typeUser !== 'ADMIN') {
            return exits.notFound({ message: "Vous n'êtes pas autorisé à accéder a cette page!" })
        }

        // VERIFICATION SI L'EMPLOI DU TEMPS EXISTE
        let existingEmploi = await EmploisDuTemps.findOne({ id: inputs.id })
        if (!existingEmploi) {
            return exits.notFound({ message: "Emploi du temps non trouvé!" })
        }

        // VERIFICATION SI L'EMPLOI DU TEMPS APPARTIENT A L'ECOLE
        if (existingEmploi.codeEcole !== user.codeEcole && user.typeUser !== 'ADMIN') {
            return exits.notFound({ message: "Vous n'êtes pas autorisé à modifier cet emploi du temps!" })
        }

        // VERIFICATION SI L'EMPLOI DU TEMPS EXISTE DEJA (sauf celui qu'on modifie)
        let duplicateEmploi = await EmploisDuTemps.find({
            codeEcole: user.codeEcole,
            codeClasse: inputs.codeClasse,
            codeMatiere: inputs.codeMatiere,
            nomJour: inputs.nomJour,
            heureDebut: inputs.heureDebut,
            heureFin: inputs.heureFin,
            anneeScolaire: inputs.anneeScolaire,
            id: { '!=': inputs.id }
        }).then(_.first)

        if (duplicateEmploi) {
            return exits.badRequest({ message: "Un emploi du temps existe déjà pour cette classe, matière, jour et horaire!" })
        }

        // VERIFICATION DES CONFLITS D'HORAIRE (sauf celui qu'on modifie)
        let conflitHoraire = await EmploisDuTemps.find({
            codeEcole: user.codeEcole,
            codeClasse: inputs.codeClasse,
            nomJour: inputs.nomJour,
            anneeScolaire: inputs.anneeScolaire,
            id: { '!=': inputs.id },
            or: [
                {
                    and: [
                        { heureDebut: { '<=': inputs.heureDebut } },
                        { heureFin: { '>': inputs.heureDebut } }
                    ]
                },
                {
                    and: [
                        { heureDebut: { '<': inputs.heureFin } },
                        { heureFin: { '>=': inputs.heureFin } }
                    ]
                },
                {
                    and: [
                        { heureDebut: { '>=': inputs.heureDebut } },
                        { heureFin: { '<=': inputs.heureFin } }
                    ]
                }
            ]
        }).then(_.first)

        if (conflitHoraire) {
            return exits.badRequest({ message: "Il y a un conflit d'horaire avec un autre cours!" })
        }

        // MISE A JOUR DE L'EMPLOI DU TEMPS
        let updatedEmploi = await EmploisDuTemps.updateOne({ id: inputs.id })
            .set({
                codeMatiere: inputs.codeMatiere,
                codeEnseignant: inputs.codeEnseignant,
                codeClasse: inputs.codeClasse,
                dateConfig: inputs.dateConfig,
                idJour: inputs.idJour,
                nomJour: inputs.nomJour,
                heureDebut: inputs.heureDebut,
                heureFin: inputs.heureFin,
                libelleClasse: inputs.libelleClasse,
                anneeScolaire: inputs.anneeScolaire
            })

        // All done.
        return exits.success({
            message: "Emploi du temps mis à jour avec succès!",
            data: updatedEmploi
        });
    },
}; 