/**
 * Helper pour surveiller l'état des notifications d'abonnement
 * Approche hybride : envoi immédiat + traitement différé
 */

module.exports = {
    friendlyName: 'Monitor notifications status',

    description: 'Surveille l\'état des notifications d\'abonnement pour l\'approche hybride',

    inputs: {
        codeEcole: {
            type: 'string',
            description: 'Code de l\'école pour filtrer les notifications'
        },
        limit: {
            type: 'number',
            defaultsTo: 50,
            description: 'Nombre maximum de notifications à analyser'
        }
    },

    exits: {
        success: {
            description: 'Statut des notifications récupéré avec succès'
        },
        error: {
            description: 'Erreur lors de la récupération du statut'
        }
    },

    fn: async function ({ codeEcole, limit }, exits) {
        try {
            const whereClause = codeEcole ? { codeEcole } : {};

            // Récupérer toutes les notifications récentes
            const notifications = await NotificationAbonnement.find(whereClause)
                .sort('dateEnvoi DESC')
                .limit(limit);

            // Analyser les statuts
            const stats = {
                total: notifications.length,
                parStatut: {},
                parType: {},
                parCanal: {
                    email: { envoye: 0, non_envoye: 0, echoue: 0 },
                    whatsapp: { envoye: 0, non_envoye: 0, echoue: 0 },
                    sms: { envoye: 0, non_envoye: 0, echoue: 0 }
                },
                tentatives: { 0: 0, 1: 0, 2: 0, 3: 0 },
                approcheHybride: {
                    envoiImmediat: 0,
                    traitementDiffere: 0,
                    echecImmediat: 0
                }
            };

            notifications.forEach(notification => {
                // Statistiques par statut
                const statut = notification.statut || 'inconnu';
                stats.parStatut[statut] = (stats.parStatut[statut] || 0) + 1;

                // Statistiques par type
                const type = notification.typeNotification || 'inconnu';
                stats.parType[type] = (stats.parType[type] || 0) + 1;

                // Statistiques par canal
                if (notification.statutEnvoi) {
                    Object.keys(notification.statutEnvoi).forEach(canal => {
                        const statutCanal = notification.statutEnvoi[canal];
                        if (stats.parCanal[canal] && stats.parCanal[canal][statutCanal] !== undefined) {
                            stats.parCanal[canal][statutCanal]++;
                        }
                    });
                }

                // Statistiques des tentatives
                const tentatives = notification.nombreTentatives || 0;
                if (stats.tentatives[tentatives] !== undefined) {
                    stats.tentatives[tentatives]++;
                }

                // Analyse de l'approche hybride
                if (notification.statut === 'envoyee' && notification.nombreTentatives === 1) {
                    stats.approcheHybride.envoiImmediat++;
                } else if (notification.statut === 'envoyee' && notification.nombreTentatives > 1) {
                    stats.approcheHybride.traitementDiffere++;
                } else if (notification.statut === 'non_lue' && notification.erreurEnvoi && notification.erreurEnvoi.includes('Envoi immédiat échoué')) {
                    stats.approcheHybride.echecImmediat++;
                }
            });

            // Calcul des pourcentages
            const pourcentages = {
                envoiImmediat: stats.total > 0 ? ((stats.approcheHybride.envoiImmediat / stats.total) * 100).toFixed(2) : 0,
                traitementDiffere: stats.total > 0 ? ((stats.approcheHybride.traitementDiffere / stats.total) * 100).toFixed(2) : 0,
                echecImmediat: stats.total > 0 ? ((stats.approcheHybride.echecImmediat / stats.total) * 100).toFixed(2) : 0
            };

            // Logs détaillés
            sails.log.info('📊 Statut des notifications d\'abonnement (Approche Hybride):');
            sails.log.info(`   Total: ${stats.total}`);
            sails.log.info(`   Envoi immédiat réussi: ${stats.approcheHybride.envoiImmediat} (${pourcentages.envoiImmediat}%)`);
            sails.log.info(`   Traitement différé réussi: ${stats.approcheHybride.traitementDiffere} (${pourcentages.traitementDiffere}%)`);
            sails.log.info(`   Échec envoi immédiat: ${stats.approcheHybride.echecImmediat} (${pourcentages.echecImmediat}%)`);

            return exits.success({
                message: 'Statut des notifications récupéré avec succès',
                stats,
                pourcentages,
                approcheHybride: {
                    description: 'Envoi immédiat + Traitement différé automatique',
                    avantages: [
                        'Réactivité maximale pour les notifications critiques',
                        'Retry automatique en cas d\'échec',
                        'Fiabilité garantie par le traitement différé',
                        'Performance optimisée du webhook'
                    ]
                }
            });

        } catch (error) {
            sails.log.error('Erreur dans monitor-notifications-status:', error);
            return exits.error(error);
        }
    }
};
