/**
 * init-payment.js
 *
 * @description :: Initialise un paiement FedaPay pour un abonnement et renvoie l'URL de paiement
 */

module.exports = {
    friendlyName: 'Init paiement FedaPay',

    description: 'Initialiser un paiement FedaPay pour un abonnement existant',

    inputs: {
        codeAbonnement: {
            type: 'string',
            required: true,
            description: 'Code de l\'abonnement'
        },
        returnUrl: {
            type: 'string',
            description: 'URL de retour (facultatif)'
        }
    },

    exits: {
        success: {
            description: 'URL de paiement renvoyée',
            responseType: 'ok'
        },
        abonnementNonTrouve: {
            description: 'Abonnement introuvable',
            responseType: 'notFound'
        },
        error: {
            description: 'Erreur interne'
        }
    },

    fn: async function (inputs, exits) {
        const { user } = this.req.token;

        try {
            // Charger l'abonnement
            const abonnement = await Abonnement.findOne({ codeAbonnement: inputs.codeAbonnement, codeEcole: user.codeEcole });
            if (!abonnement) {
                return exits.abonnementNonTrouve({ message: 'Abonnement introuvable', code: 'SUBSCRIPTION_NOT_FOUND' });
            }

            // Charger l'utilisateur et l'offre
            const utilisateur = await Utilisateurs.findOne({ codeUser: abonnement.codeParent, codeEcole: user.codeEcole });

            // Charger l'offre avec vérification de l'école
            let offre = await OffreAbonnement.findOne({
                codeOffre: abonnement.codeOffre,
                //codeEcole: user.codeEcole 
            });

            // Si l'offre n'est pas trouvée pour cette école, essayer de la trouver sans filtre école (offre globale)
            if (!offre) {
                offre = await OffreAbonnement.findOne({
                    codeOffre: abonnement.codeOffre,
                    //codeEcole: null // Offre valable pour toutes les écoles
                });
            }

            // Vérifier que l'offre existe
            if (!offre) {
                sails.log.error('Offre introuvable pour l\'abonnement:', {
                    codeOffre: abonnement.codeOffre,
                    codeEcole: user.codeEcole,
                    abonnement: abonnement.codeAbonnement
                });
                return exits.error(new Error(`Offre introuvable: ${abonnement.codeOffre}`));
            }

            // Vérifier que l'offre a un nom
            if (!offre.nom) {
                sails.log.error('Offre sans nom:', {
                    codeOffre: offre.codeOffre,
                    offre: offre
                });
                return exits.error(new Error('Offre invalide: nom manquant'));
            }

            // Appeler le helper
            const { paymentUrl, fedapayTransactionId, reference } = await sails.helpers.fedapayInitTransaction.with({
                abonnement, utilisateur: utilisateur || {}, offre, returnUrl: inputs.returnUrl
            });

            return exits.success({
                message: 'Paiement initialisé',
                data: { paymentUrl, fedapayTransactionId, reference }
            });

        } catch (error) {
            sails.log.error('Erreur init paiement FedaPay:', error);
            const errMsg = error && error.message ? error.message : 'Erreur interne du serveur';
            return exits.error(new Error(errMsg));
        }
    }
}; 