let moment = require('moment');

module.exports = {
  friendlyName: 'Login',
  description: 'Login auth.',

  inputs: {
    username: {
      type: 'string',
      required: true // Correction : 'require' -> 'required'
    },
    password: {
      type: 'string',
      required: true // Correction : 'require' -> 'required'
    },
    codeVerif: {
      type: 'string',
      required: true // Correction : 'require' -> 'required'
    },
    email: {
      type: 'string',
    }
    /*ip: {
      type: 'string',
    },
    location: {
      type: 'string',
    },
    departement: {
      type: 'string',
    },
    longitude: {
      type: 'string',
    },
    latitude: {
      type: 'string',
    },*/
  },

  exits: {
    notFound: {
      description: 'User not found',
      statusCode: 404
    },
    encryptionError: {
      statusCode: 500
    }
  },

  fn: async function ({ username, password, codeVerif, email /*ip, location, departement, longitude, latitude*/ }, exits) {
    let ouestDate = moment.utc(new Date()).utcOffset('+01:00');
    let date = ouestDate.format('YYYY-MM-DD');
    let heure = ouestDate.format('HH:mm:ss');
    try {
      // Générer la date et l'heure
      // Chiffrer le mot de passe
      password = await new Promise((resolve, reject) => {
        sails.config.cryptoUtils.encrypt(password, (err, encryptedPassword) => {
          if (err) {
            ActivityLogs.create({
              date,
              heure,
              username,
              action: "CONNEXION_CODEVERIF",
              status: "failed",
              errorMessage: "Erreur de chiffrement",
              device: "Web"
            });
            reject('encryptionError');
          } else {
            resolve(encryptedPassword);
          }
        });
      });

      console.log('INPUTS', username, codeVerif, password);

      // Vérifier que les champs ne sont pas vides
      if (username === '' || password === '') {
        await ActivityLogs.create({
          date,
          heure,
          username,
          action: "CONNEXION_CODEVERIF",
          status: "failed",
          errorMessage: "Champs manquants",
          device: "Web"
        });
        return exits.notFound('Veuillez renseigner tous les champs');
      }

      // Rechercher l'utilisateur
      let user = await Utilisateurs.findOne({ login: username, codeVerif: codeVerif, desactiverCompte: false });
      if (!user) {
        await ActivityLogs.create({
          date,
          heure,
          username,
          action: "CONNEXION_CODEVERIF",
          status: "failed",
          errorMessage: "Utilisateur non trouvé ou code incorrect",
          device: "Web"
        });
        return exits.notFound('Utilisateur non trouvé');
      }

      // Mettre à jour le mot de passe
      await Utilisateurs.update({ login: user.login }, { password: password, isUpdate: true });

      // mise a jour mail si renseigné
      if (email) {
        await Utilisateurs.updateOne({ id: user.id })
          .set({
            email: email,
          });
      }

      // Générer un token JWT
      let token = await sails.helpers.jwt.sign.with({ payload: user });
      if (!token) {
        await ActivityLogs.create({
          date,
          heure,
          username,
          action: "CONNEXION_CODEVERIF",
          status: "failed",
          errorMessage: "Token non généré",
          device: "Web"
        });
        throw 'signInFailed';
      }

      // Créer un enregistrement de token
      let lastIdAuto = await Token.find().sort('id DESC').then(_.first);
      let id = lastIdAuto ? parseInt(lastIdAuto.id) + 1 : 1;

      await Token.create({
        id: id,
        token_salt: token,
        owner: user.id,
      }).fetch();

      // Récupérer les informations de l'école
      let ecole = await Ecoles.findOne({ codeEcole: user.codeEcole });

      // Préparer la réponse
      let auth = _.merge(user, {
        tokenSalt: token,
        ecole: ecole,
      });

      // Enregistrer l'activité de connexion (succès)
      await ActivityLogs.create({
        date,
        heure,
        username: user.login,
        action: "CONNEXION_CODEVERIF",
        status: "success",
        errorMessage: null,
        device: "Web"
      }).fetch();

      // Retourner la réponse
      return exits.success(auth);
    } catch (err) {
      sails.log.error('Erreur lors de la connexion:', err);
      await ActivityLogs.create({
        date,
        heure,
        username,
        action: "CONNEXION_CODEVERIF",
        status: "failed",
        errorMessage: (typeof err === 'string' ? err : (err && err.message) || 'Erreur inconnue'),
        device: "Web"
      });
      return exits.error('Une erreur est survenue lors de la connexion.');
    }
  }
};