const moment = require('moment');

module.exports = {
  friendlyName: 'Reset password',
  description: 'Reset user password with valid token',

  inputs: {
    token: {
      type: 'string',
      required: true
    },
    password: {
      type: 'string',
      required: true,
      //minLength: 6
    }
  },

  exits: {
    success: {
      description: 'Password updated successfully'
    },
    invalidToken: {
      description: 'Invalid or expired token',
      statusCode: 400
    },
    encryptionError: {
      statusCode: 500
    }
  },

  fn: async function ({ token, password }, exits) {
    const momentNow = moment.utc(new Date()).utcOffset('+01:00');
    const date = momentNow.format('YYYY-MM-DD');
    const heure = momentNow.format('HH:mm:ss');
    let username = null;
    try {
      // 1. Trouver l'utilisateur avec un token valide
      const user = await Utilisateurs.findOne({
        resetToken: token,
        resetTokenExpiresAt: { '>=': new Date().toISOString() }
      });
      if (!user) {
        await ActivityLogs.create({
          date,
          heure,
          username: null,
          action: "RESET_PASSWORD_REQUEST",
          status: "failed",
          errorMessage: "Token invalide ou expiré",
          device: "Web"
        });
        return exits.invalidToken('Token invalide ou expiré');
      }
      username = user.login;
      // 2. Chiffrer le nouveau mot de passe
      const encryptedPassword = await new Promise((resolve, reject) => {
        sails.config.cryptoUtils.encrypt(password, (err, encrypted) => {
          if (err) reject('encryptionError');
          else resolve(encrypted);
        });
      });
      // 3. Mettre à jour le mot de passe et effacer le token
      await Utilisateurs.updateOne({ id: user.id }).set({
        password: encryptedPassword,
        resetToken: null,
        resetTokenExpiresAt: null,
      });
      // 4. Journaliser l'activité (succès)
      await ActivityLogs.create({
        date,
        heure,
        username,
        action: "RESET_PASSWORD_REQUEST",
        status: "success",
        errorMessage: null,
        device: "Web"
      });
      return exits.success({
        message: 'Mot de passe mis à jour avec succès'
      });
    } catch (err) {
      await ActivityLogs.create({
        date,
        heure,
        username,
        action: "RESET_PASSWORD_REQUEST",
        status: "failed",
        errorMessage: (typeof err === 'string' ? err : (err && err.message) || 'Erreur inconnue'),
        device: "Web"
      });
      if (err === 'encryptionError') {
        return exits.encryptionError();
      }
      return exits.error(err);
    }
  }
};