module.exports = {
    friendlyName: "Find",

    description: "Find Enseignants.",

    inputs: {
        search: {
            type: "string",
            required: false
        },
        codeEcole: {
            type: "string",
            required: false
        },
        fonction: {
            type: "string",
            required: false
        },
        sexe: {
            type: "string",
            required: false
        }
    },

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

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

        // CONFIGURATION DE LA PAGINATION
        this.req.query.limit = this.req.query.limit || "50";
        this.req.query.skip = this.req.query.skip || "0";

        let userCodeEcole;
        if (user.typeUser === 'ADMINISTRATION' || user.typeUser === 'SECRETARIAT') {
            userCodeEcole = user.codeEcole
        } else if (user.typeUser === 'ADMIN') {
            userCodeEcole = inputs.codeEcole || undefined
        } else if (user.typeUser === 'ENSEIGNANT') {
            userCodeEcole = user.codeEcole
        } else {
            return exits.notFound({ message: "Vous n'êtes pas autorisé à accéder a cette page!" })
        }

        // CONSTRUCTION DES CONDITIONS DE RECHERCHE
        let fixedAttr = ["codeEcole", "fonction", "sexe"];

        let cond = {
            codeEcole: userCodeEcole,
            or: [
                { nom: { contains: inputs.search ? inputs.search.toUpperCase() : "" } },
                { codeEnseignant: { contains: inputs.search ? inputs.search.toUpperCase() : "" } },
                { fonction: { contains: inputs.search ? inputs.search.toUpperCase() : "" } }
            ]
        };

        // AJOUT DES FILTRES OPTIONNELS
        if (inputs.fonction && inputs.fonction !== '') {
            cond.fonction = inputs.fonction;
        }

        if (inputs.sexe && inputs.sexe !== '') {
            cond.sexe = inputs.sexe;
        }

        // SUPPRESSION DES CONDITIONS VIDE POUR LA RECHERCHE
        if (!inputs.search || inputs.search === '') {
            delete cond.or;
        }

        let options = {
            ...this.req.query,
            fixCond: _.pick(cond, fixedAttr),
            sort: "nom ASC",
        };

        // RECUPERATION DES ENSEIGNANTS AVEC PAGINATION
        let enseignants = await sails.helpers
            .paginator(Enseignants, cond, options)
            .then(async (enseignants) => {
                enseignants.data = await Promise.all(
                    enseignants.data.map(async (enseignant) => {
                        // Récupération des informations de l'école
                        if (enseignant.codeEcole) {
                            let ecole = await Ecoles.find({ codeEcole: enseignant.codeEcole }).then(_.first);
                            if (ecole) {
                                enseignant.nomEcole = ecole.nomEcole;
                            }
                        }

                        // Récupération du nombre de classes attribuées
                        let classesAttribuees = await EnseignantsClasse.find({
                            codeEnseignant: enseignant.codeEnseignant,
                            codeEcole: enseignant.codeEcole
                        });
                        enseignant.nombreClasses = classesAttribuees.length;

                        return enseignant;
                    })
                );
                return enseignants;
            });

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