module.exports = {
    friendlyName: "Create",

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

    inputs: {
        codeMatiere: {
            type: "string",
            required: true
        },
        codeEnseignant: {
            type: "string",
            required: true
        },
        codeClasse: {
            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 DEJA
        let existingEmploi = await EmploisDuTemps.find({
            codeEcole: user.codeEcole,
            codeClasse: inputs.codeClasse,
            codeMatiere: inputs.codeMatiere,
            nomJour: inputs.nomJour,
            heureDebut: inputs.heureDebut,
            heureFin: inputs.heureFin,
            anneeScolaire: inputs.anneeScolaire
        }).then(_.first)

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

        // VERIFICATION DES CONFLITS D'HORAIRE
        let conflitHoraire = await EmploisDuTemps.find({
            codeEcole: user.codeEcole,
            codeClasse: inputs.codeClasse,
            nomJour: inputs.nomJour,
            anneeScolaire: inputs.anneeScolaire,
            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!" })
        }

        // CREATION DE L'EMPLOI DU TEMPS
        let currentDate = new Date().toISOString().split('T')[0]; // Format YYYY-MM-DD

        let newEmploi = await EmploisDuTemps.create({
            codeMatiere: inputs.codeMatiere,
            codeEnseignant: inputs.codeEnseignant,
            codeEcole: user.codeEcole,
            codeClasse: inputs.codeClasse,
            dateConfig: currentDate,
            idJour: inputs.idJour,
            nomJour: inputs.nomJour,
            heureDebut: inputs.heureDebut,
            heureFin: inputs.heureFin,
            libelleClasse: inputs.libelleClasse,
            anneeScolaire: inputs.anneeScolaire
        }).fetch()

        // All done.
        return exits.success({
            message: "Emploi du temps créé avec succès!",
            data: newEmploi
        });
    },
}; 