module.exports = {
  friendlyName: "Find",

  description: "Find Matiere Classe.",

  inputs: {
    search: {
      type: "string",
    },
    /*trimSem: {
      type: "string",
      require: true
    },*/
    anneeScolaire: {
      type: "string",
      require: true
    },
    codeClasse: {
      type: "string",
      require: true
    },
    estProf: {
      type: "boolean",
      defaultsTo: false
    }
  },

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

  fn: async function (inputs, exits) {
    const { id, user } = this.req.token;
    //console.log("ID", id, user.login, user.typeUser, user.codeEcole)

    // 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 utulisateur pour a accéder a cette page!" })
    }
    ecoleVerif = await Ecoles.find({ codeEcole: user.codeEcole }).then(_.first)
    if (!ecoleVerif) {
      return exits.notFound({ message: "Cet utilisateur n'est attribué a aucune classe!" })
    }
    // FIN VERIF CODE ECOLE

    // VERIF SI ANNEE SCOLAIRE EST PASSEE
    console.log("Annee Scolaire", inputs.anneeScolaire)
    if (inputs.anneeScolaire === '' || inputs.anneeScolaire === null || inputs.anneeScolaire === undefined) {
      return exits.notFound({ message: "Veuillez préciser une année scolaire pour a accéder a cette page!" })
    }
    //// FIN

    this.req.query.limit = this.req.query.limit || "10";
    this.req.query.skip = this.req.query.skip || "0";

    let userCodeEcole;
    if (user.typeUser === 'ADMINISTRATION') {
      userCodeEcole = user.codeEcole
    } else if (user.typeUser === 'ENSEIGNANT' || 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!" })

    }
    //console.log("userCodeEcole", userCodeEcole)

    let fixedAttr = ["codeEcole", "codeClasse", "anneeScolaire"];

    /*if(inputs.role === '' || inputs.role === undefined || inputs.role === null || inputs.role === 'undefined'){
        inputs.role = undefined
    }*/
    let cond = {
      codeEcole: userCodeEcole,
      codeClasse: inputs.codeClasse ? inputs.codeClasse : undefined,
      // DONT GET MATIERE anneeScolaire: inputs.anneeScolaire ? inputs.anneeScolaire : undefined,

      or: [
        //{ matricule: { contains: inputs.search ? inputs.search.toUpperCase() : "" } },
        { libelleCourt: { contains: inputs.search ? inputs.search.toUpperCase() : "" } },
        { libelleLong: { contains: inputs.search ? inputs.search.toUpperCase() : "" } },
      ],
    };

    // Si estProf est true, filtrer les matières selon les matières attribuées au professeur
    if (inputs.estProf === true && user.typeUser === 'ENSEIGNANT') {
      try {
        // Récupérer toutes les matières attribuées au professeur
        const matieresAttribuees = await EnseignantsClasse.find({
          codeEnseignant: user.codeUser,
          codeEcole: user.codeEcole,
          anneeScolaire: inputs.anneeScolaire
        });

        if (matieresAttribuees && matieresAttribuees.length > 0) {
          // Extraire les codes de matières attribuées
          const codesMatieresAttribuees = matieresAttribuees.map(att => att.codeMatiere);

          // Ajouter le filtre sur les matières attribuées
          cond.codeMatiere = codesMatieresAttribuees;

          // Mettre à jour les attributs fixes pour la pagination
          fixedAttr = ["codeEcole", "anneeScolaire"];
        } else {
          // Si aucune matière n'est attribuée, retourner une liste vide
          return exits.success({
            data: [],
            total: 0,
            page: 1,
            limit: parseInt(this.req.query.limit) || 10,
            pages: 0
          });
        }
      } catch (error) {
        console.error('Erreur lors de la récupération des matières attribuées au professeur:', error);
        return exits.notFound({ message: "Erreur lors de la récupération des matières attribuées" });
      }
    }

    //console.log("cond", cond)

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


    let matieresClasses = await sails.helpers
      .paginator(AttributionMatiere, cond, options);

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