module.exports = {
    friendlyName: "Find Classe Programme",

    description: "Find programme de cours pour une classe.",

    inputs: {
        codeClasse: {
            type: "string",
            required: true
        },
        anneeScolaire: {
            type: "string",
            required: true
        }
    },

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

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

        // Vérification du code école
        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!" })
        }
        let 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
        const allowedRoles = ['ADMIN', 'ADMINISTRATION', 'SECRETARIAT', 'ENSEIGNANT', 'PARENT'];
        if (!allowedRoles.includes(user.typeUser)) {
            return exits.notFound({ message: "Vous n'êtes pas autorisé à accéder à cette page!" })
        }

        // Vérification des inputs
        if (!inputs.codeClasse || !inputs.anneeScolaire) {
            return exits.notFound({ message: "Veuillez préciser la classe et l'année scolaire!" })
        }

        // Pagination
        this.req.query.limit = this.req.query.limit || "2000";
        this.req.query.skip = this.req.query.skip || "0";

        let cond = {
            codeEcole: user.codeEcole,
            codeClasse: inputs.codeClasse,
            anneeScolaire: inputs.anneeScolaire
        };

        let options = {
            ...this.req.query,
            fixCond: cond,
            sort: "codeProgramme DESC",
        };

        let programmes = await sails.helpers
            .paginator(Programme, cond, options)
            .then(async (programmes) => {
                programmes.data = await Promise.all(
                    programmes.data.map(async (programme) => {
                        // Détail classe
                        if (programme.codeClasse) {
                            let classe = await Classe.find({ codeClasse: programme.codeClasse }).then(_.first);
                            if (classe) programme.nomClasse = classe.libelleClasse;
                        }
                        // Détail matière
                        if (programme.codeClasse && programme.codeMatiere) {
                            let matiere = await AttributionMatiere.find({
                                codeClasse: programme.codeClasse,
                                codeMatiere: programme.codeMatiere,
                                codeEcole: user.codeEcole
                            }).then(_.first);
                            if (matiere) programme.nomMatiere = matiere.libelleCourt;
                        }
                        // Détail enseignant
                        if (programme.codeEnseignant) {
                            let enseignant = await Enseignants.find({ codeEnseignant: programme.codeEnseignant }).then(_.first);
                            if (enseignant) programme.nomEnseignant = enseignant.nom;
                        }
                        return programme;
                    })
                );
                return programmes;
            });

        // All done.
        return exits.success(programmes);
    },
}; 