const moment = require('moment');

module.exports = {
    friendlyName: 'Reset password mobile',
    description: 'Réinitialise le mot de passe mobile après vérification du code',

    inputs: {
        username: {
            type: 'string',
            required: true
        },
        code: {
            type: 'string',
            required: true
        },
        newPassword: {
            type: 'string',
            required: true
        }
    },

    exits: {
        success: {
            description: 'Mot de passe réinitialisé avec succès'
        },
        invalid: {
            description: 'Code invalide ou expiré',
            statusCode: 400
        },
        userNotFound: {
            description: 'Utilisateur non trouvé',
            statusCode: 404
        },
        encryptionError: {
            statusCode: 500
        }
    },

    fn: async function ({ username, code, newPassword }, exits) {
        try {
            const user = await Utilisateurs.findOne({
                login: username,
                desactiverCompte: false
            });
            if (!user) {
                return exits.userNotFound('Utilisateur non trouvé');
            }
            if (!user.resetToken || !user.resetTokenExpiresAt) {
                return exits.invalid('Aucune demande de code en cours');
            }
            if (user.resetToken !== code) {
                return exits.invalid('Code invalide');
            }
            if (moment().isAfter(moment(user.resetTokenExpiresAt))) {
                return exits.invalid('Code expiré');
            }
            // Chiffrer le nouveau mot de passe
            const encryptedPassword = await new Promise((resolve, reject) => {
                sails.config.cryptoUtils.encrypt(newPassword, (err, encrypted) => {
                    if (err) reject('encryptionError');
                    else resolve(encrypted);
                });
            });
            // Mettre à jour le mot de passe et effacer le code
            await Utilisateurs.updateOne({ id: user.id }).set({
                password: encryptedPassword,
                resetToken: null,
                resetTokenExpiresAt: null,
                isUpdate: true
            });
            // Log Activity
            const ouestDate = moment.utc(new Date()).utcOffset('+01:00');
            await ActivityLogs.create({
                date: ouestDate.format('YYYY-MM-DD'),
                heure: ouestDate.format('HH:mm:ss'),
                username: user.login,
                action: "RESET_PASSWORD_MOBILE",
                status: "success",
                errorMessage: null,
                device: "Mobile"
            });
            return exits.success({ message: 'Mot de passe réinitialisé avec succès' });
        } catch (err) {
            await ActivityLogs.create({
                date: moment().format('YYYY-MM-DD'),
                heure: moment().format('HH:mm:ss'),
                username: username,
                action: "RESET_PASSWORD_MOBILE",
                status: "failed",
                errorMessage: (typeof err === 'string' ? err : (err && err.message) || 'Erreur inconnue'),
                device: "Mobile"
            });
            if (err === 'encryptionError') {
                return exits.encryptionError();
            }
            return exits.invalid('Erreur lors de la réinitialisation du mot de passe');
        }
    }
}; 