let moment = require('moment')
module.exports = {


    friendlyName: 'Create',


    description: 'Create Information user!',


    inputs: {
        titre: {
            type: 'string',
            required: true
        },
        description: {
            type: 'string',
        },

        codeClasse: {
            type: 'string',
        },
        qui: {
            type: 'string',
        },
        anneeScolaire: {
            type: 'string',
        },

    },


    exits: {
        notFound: {
            statusCode: 404
        },
    },


    fn: async function (inputs, exits) {

        //console.log("INPUTS 1", inputs)
        const { id, user } = this.req.token;

        let userCodeEcole;
        if (user.typeUser === 'ADMINISTRATION') {
            userCodeEcole = user.codeEcole
        } else if (user.typeUser === 'ADMIN') {
            userCodeEcole = user.codeEcole//undefined
        } else {
            return exits.notFound({ message: "Vous n'etes pas autoriser a accéder a cette page!" })

        }

        // VERIFICATION DU CODE ECOLE
        if (user.codeEcole === '' || user.codeEcole === null || user.codeEcole === undefined) {
            return exits.notFound({ message: "Veuillez préciser le code Ecole pour cet utulisateur pour a accéder a cette page!" })
        }
        ecoleVerif = await Ecoles.find({ codeEcole: user.codeEcole }).then(_.first)
        if (!ecoleVerif) {
            return exits.notFound({ message: "Cet utilisateur n'est attribué a aucune ecole!" })
        }
        // FIN VERIF CODE ECOLE

        inputs.codeEcole = userCodeEcole
        ///////////////////

        let ouestDate = moment.utc(new Date()).utcOffset('+01:00')
        inputs.date = moment(ouestDate, 'DD/MM/YYYY').format('YYYY-MM-DD')
        inputs.heure = moment(ouestDate).format('HH:mm:ss')

        let information = await InformationsUser.create(inputs).fetch();

        // Envoi notification push aux parents concernés (classe ciblée ou toutes classes)
        try {
            //console.log('🔔 DÉBUT ENVOI NOTIFICATION PUSH');
            //console.log('📋 Paramètres:', { codeEcole: userCodeEcole, codeClasse: inputs.codeClasse, anneeScolaire: inputs.anneeScolaire });

            const codeClasseCible = inputs.codeClasse;
            let libelleClasse = null;

            // 1) Préparer les critères d'attribution (classe ciblée ou toutes classes)
            const attribsWhere = { codeEcole: userCodeEcole };
            if (inputs.anneeScolaire) { attribsWhere.anneeScolaire = inputs.anneeScolaire; }
            if (codeClasseCible) {
                attribsWhere.codeClasse = codeClasseCible;
                const classe = await Classe.findOne({ codeEcole: userCodeEcole, codeClasse: codeClasseCible });
                libelleClasse = classe ? classe.libelleClasse : null;
                //console.log('🏫 Classe trouvée:', { codeClasse: codeClasseCible, libelleClasse });
            }

            //console.log('🔍 Recherche attributions avec critères:', attribsWhere);
            const attributions = await AttributionClasse.find(attribsWhere);
            //console.log('📚 Attributions trouvées:', attributions.length);

            const matricules = _.uniq(attributions.map(a => a.matricule).filter(Boolean));
            //console.log('👥 Matricules uniques:', matricules.length, matricules);
 
            if (matricules.length > 0) {
                // 2) Récupérer les filiations actives vers les parents
                //console.log('🔗 Recherche filiations pour matricules:', matricules);
                const filiations = await Filiation.find({ codeEcole: userCodeEcole, matricule: { in: matricules } });
                //console.log('👨‍👩‍👧‍👦 Filiations trouvées:', filiations.length);

                const codeParents = _.uniq(filiations.map(f => f.codeParent).filter(Boolean));
                //console.log('👨‍👩‍👧‍👦 Code parents uniques:', codeParents.length, codeParents);

                if (codeParents.length > 0) {
                    // 3) Récupérer les tokens FCM de ces parents
                    //console.log('📱 Recherche tokens FCM pour parents:', codeParents);
                    const tokens = await PushToken.find({ codeUser: { in: codeParents } });
                    //console.log('📱 Tokens FCM trouvés:', tokens.length);
                    //console.log('📱 Détail tokens:', tokens.map(t => ({ codeUser: t.codeUser, fcmToken: t.fcmToken ? t.fcmToken.substring(0, 20) + '...' : 'NULL' })));

                    const tokenList = _.uniq(tokens.map(t => t.fcmToken).filter(Boolean));
                    //console.log('📱 Tokens FCM uniques valides:', tokenList.length);

                    if (tokenList.length > 0) {
                        const effectiveTitle = inputs.titre || (codeClasseCible && libelleClasse ? `Informations - ${libelleClasse}` : 'Nouvelle information');
                        const effectiveBody = inputs.description || (codeClasseCible ? `Nouvelle information pour la classe ${libelleClasse || codeClasseCible}` : 'Nouvelle information');
                        const data = {
                            route: '/notifications',
                            type: 'information',
                            infoId: String(information.id || information.code || ''),
                            codeClasse: codeClasseCible || '',
                            libelleClasse: libelleClasse || ''
                        };

                        //console.log('📤 Envoi notification FCM:');
                        //console.log('   - Titre:', effectiveTitle);
                        //console.log('   - Corps:', effectiveBody);
                        //console.log('   - Données:', data);
                        //console.log('   - Nombre de tokens:', tokenList.length);

                        const fcmResult = await sails.helpers.sendFcm.with({
                            tokens: tokenList,
                            title: effectiveTitle,
                            body: effectiveBody,
                            data
                        });

                        //console.log('✅ Résultat envoi FCM:', fcmResult);

                        // Log détaillé des résultats
                        if (fcmResult && fcmResult.results) {
                            const successCount = fcmResult.results.filter(r => r.status === 'sent').length;
                            const failedCount = fcmResult.results.filter(r => r.status === 'failed').length;
                            //console.log('📊 Statistiques envoi:');
                            //console.log('   - Succès:', successCount);
                            //console.log('   - Échecs:', failedCount);

                            if (failedCount > 0) {
                                //console.log('❌ Échecs détaillés:');
                                fcmResult.results.filter(r => r.status === 'failed').forEach((failure, index) => {
                                    //console.log(`   ${index + 1}. Token: ${failure.token.substring(0, 20)}... - Erreur: ${failure.error}`);
                                });
                            }
                        }
                    } else {
                        //console.log('⚠️ Aucun token FCM valide trouvé');
                    }
                } else {
                    //console.log('⚠️ Aucun parent trouvé pour les matricules');
                }
            } else {
                //console.log('⚠️ Aucun matricule trouvé dans les attributions');
            }

            //console.log('🔔 FIN ENVOI NOTIFICATION PUSH');
        } catch (e) {
            //console.error('❌ ERREUR ENVOI NOTIFICATION PUSH:', e);
            //console.error('❌ Stack trace:', e.stack);
            sails.log.warn('Echec envoi FCM information-user:', e.message || e);
        }

        return exits.success(_.merge(information));
        // All done.


    }


};
