const moment = require('moment');
const crypto = require('crypto');
const emailTemplates = sails.config.emailTemplates;
const whatsappTemplates = sails.config.whatsappTemplates;
const appName = 'Corossol';

module.exports = {
    friendlyName: 'Forgot password',
    description: 'Send password reset instructions',

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

    exits: {
        success: {
            description: 'Instructions sent successfully'
        },
        userNotFound: {
            description: 'User not found',
            statusCode: 404
        },
        noContactMethod: {
            description: 'User has no email or phone registered',
            statusCode: 400
        },
        sendError: {
            description: 'Could not send instructions',
            statusCode: 500
        }
    },

    fn: async function ({ username }, exits) {
        const momentNow = moment.utc(new Date()).utcOffset('+01:00');
        const date = momentNow.format('YYYY-MM-DD');
        const heure = momentNow.format('HH:mm:ss');
        try {
            // 1. Trouver l'utilisateur
            const user = await Utilisateurs.findOne({
                login: username,
                desactiverCompte: false
            })
            if (!user) {
                await ActivityLogs.create({
                    date,
                    heure,
                    username,
                    action: "FORGOT_PASSWORD",
                    status: "failed",
                    errorMessage: "Utilisateur non trouvé",
                    device: "Web"
                });
                return exits.userNotFound('Utilisateur non trouvé');
            }
            const phone = user.telephone1 ? `+${user.indicatif1}${user.telephone1}` : null;
            const formattedPhone = await sails.helpers.formatPhone(phone);
            // 2. Vérifier les méthodes de contact disponibles
            const hasEmail = user.email && user.email.trim() !== '';
            const hasPhone = user.telephone1 && user.telephone1.trim() !== '';
            if (!hasEmail && !hasPhone) {
                await ActivityLogs.create({
                    date,
                    heure,
                    username,
                    action: "FORGOT_PASSWORD",
                    status: "failed",
                    errorMessage: "Aucune méthode de contact enregistrée pour cet utilisateur",
                    device: "Web"
                });
                return exits.noContactMethod('Aucune méthode de contact enregistrée pour cet utilisateur, rapprochez vous de votre école pour vos information de connexion');
            }
            // 3. Générer un token de réinitialisation (valide 24h)
            const token = require('crypto').randomBytes(20).toString('hex');
            const expiresAt = moment().add(24, 'hours').toISOString();
            await Utilisateurs.updateOne({ id: user.id }).set({
                resetToken: token,
                resetTokenExpiresAt: expiresAt
            });
            // 4. Préparer le lien de réinitialisation
            const resetLink = `${sails.config.externalApis.baseUrl}/forgot-password?token=${token}`;
            let sendResults = [];
            if (hasEmail) {
                const emailTemplate = sails.config.emailTemplates.passwordReset('Corossol', resetLink, user.nom);
                sendResults.push(
                    sails.helpers.sendMailjetEmail.with({
                        to: user.email,
                        subject: emailTemplate.subject,
                        html: emailTemplate.html
                    })
                );
            } else if (hasPhone) {
                const whatsappMessage = sails.config.whatsappTemplates.passwordReset('Corossol', resetLink);
                sendResults.push(
                    sails.helpers.sendWhatsappMessage.with({
                        to: phone,
                        text: whatsappMessage,
                        imageUrl: `https://logicielperlene.com/wp-content/uploads/2025/06/Capture-decran-2025-06-11-173042.jpg`
                    })
                );
            }
            else if (hasPhone) {
                await sails.helpers.sendTwilioSms.with({
                    to: `+${user.indicatif1}${user.telephone1}`,
                    body: `Réinitialisation mot de passe. Cliquez sur le lien: ${resetLink} (valide 24h)`
                });
            } else {
                await ActivityLogs.create({
                    date,
                    heure,
                    username,
                    action: "FORGOT_PASSWORD",
                    status: "failed",
                    errorMessage: "Aucune méthode d'envoi configurée",
                    device: "Web"
                });
                return exits.sendError('Aucune méthode d\'envoi configurée');
            }
            await Promise.all(sendResults);
            // 6. Journaliser l'activité (succès)
            await ActivityLogs.create({
                date,
                heure,
                username,
                action: "FORGOT_PASSWORD",
                status: "success",
                errorMessage: null,
                device: "Web"
            });
            return exits.success({
                message: 'Instructions envoyées avec succès'
            });
        } catch (err) {
            await ActivityLogs.create({
                date,
                heure,
                username,
                action: "FORGOT_PASSWORD",
                status: "failed",
                errorMessage: (typeof err === 'string' ? err : (err && err.message) || 'Erreur inconnue'),
                device: "Web"
            });
            return exits.sendError('Une erreur est survenue lors de l\'envoi des instructions');
        }
    }
};