/**
 * upsert-fcm-token
 *
 * Helper utilitaire pour gérer les upserts de tokens FCM
 * Remplace PushToken.upsert qui n'existe pas dans Sails.js
 */

module.exports = {
    friendlyName: 'Upsert FCM token',

    description: 'Enregistrer ou mettre à jour un token FCM pour un utilisateur',

    inputs: {
        codeUser: { type: 'string', required: true },
        deviceId: { type: 'string', required: true },
        platform: { type: 'string', required: true },
        fcmToken: { type: 'string', required: true },
        codeEcole: { type: 'string', required: true },
        appVersion: { type: 'string', allowNull: true },
        lang: { type: 'string', allowNull: true }
    },

    exits: {
        success: { description: 'Token FCM upserté avec succès' },
        error: { description: 'Erreur lors de l\'upsert' }
    },

    fn: async function (inputs, exits) {
        try {
            const { codeUser, deviceId, platform, fcmToken, codeEcole, appVersion, lang } = inputs;

            // Rechercher un token existant
            const existingToken = await PushToken.findOne({
                codeUser: codeUser,
                deviceId: deviceId,
                platform: platform
            });

            let result;
            if (existingToken) {
                // Mettre à jour le token existant
                result = await PushToken.updateOne({ id: existingToken.id })
                    .set({
                        fcmToken: fcmToken,
                        appVersion: appVersion || '1.0.0',
                        lang: lang || 'fr',
                        codeEcole: codeEcole,
                        lastActiveAt: new Date()
                    });
                sails.log.info(`🔄 Token FCM mis à jour pour ${codeUser} sur ${platform}`);
            } else {
                // Créer un nouveau token
                result = await PushToken.create({
                    codeUser: codeUser,
                    deviceId: deviceId,
                    platform: platform,
                    fcmToken: fcmToken,
                    appVersion: appVersion || '1.0.0',
                    lang: lang || 'fr',
                    codeEcole: codeEcole,
                    lastActiveAt: new Date()
                });
                sails.log.info(`✅ Nouveau token FCM créé pour ${codeUser} sur ${platform}`);
            }

            // S'abonner automatiquement au topic de l'école
            try {
                await sails.helpers.manageFcmTopic.with({
                    action: 'subscribe',
                    fcmToken: fcmToken,
                    topic: `school-${codeEcole}`
                });
                sails.log.info(`🔔 Utilisateur ${codeUser} abonné au topic école: school-${codeEcole}`);
            } catch (topicError) {
                sails.log.warn(`⚠️  Échec abonnement topic école pour ${codeUser}:`, topicError.message);
            }

            return exits.success({
                action: existingToken ? 'updated' : 'created',
                token: result
            });

        } catch (error) {
            sails.log.error('Erreur upsert FCM token:', error);
            return exits.error(error);
        }
    }
};
