/////////////////////////////////////////////////
// APPELS DES MODULES
/////////////////////////////////////////////////
const path = require("path");
// CALCUL DE DATE
const moment = require('moment');
// STRIPE
const stripe = require('stripe')(process.env.STRIPE_RI_PRIVATE_KEY);
//const stripe = require('stripe')(process.env.STRIPE_PRIVATE_KEY_TEST);

/////////////////////////////////////////////////
// APPELS DES MODULES PERSOS
/////////////////////////////////////////////////
// loggings
const logger = require("../public/js/app/logger_rassemblement");
// DB
const { connect_DB_promise } = require('../modules/db/databaseconnect');
// recherche si identifiant saisie est bien dans la base de données des adhérents
const { checkAdherent } = require('../modules/db/checkAdherent');
// Envoie mail
const envoie_mail = require("../modules/envoie_mail");

////////////////////////////////////////////////////
// FILE NAME
////////////////////////////////////////////////////
const filename = path.parse(__filename).base;

// GOOGLE SHEET PARAMETERS
/////////////////////////////////////////////////
const { GoogleSpreadsheet } = require('google-spreadsheet');
const GS_creds_rassemblementidf = require('../inscriptionsafps-53b60452f63d.json');
const GS_rassemblementidf = new GoogleSpreadsheet('19Y1M7mZFSJrycQTtNxV2Cmmyz2OaeXHmwCKVCgy1r7Q');
const { error } = require("console");


/////////////////////////////////////////////////
// FONCTIONS
/////////////////////////////////////////////////

const RI_checkidentifiant = async function(req, res) {

    logger.info("======================================", { label: filename });
    logger.info("======== FUNCTION RI_checkidentifiant ==========", { label: filename });
    logger.info("======================================", { label: filename });

    // un tag pour ne pas ajouter plusieurs fois le même participant en cas de rafraîchissement de la page
    req.session.participant_ajoute = "non";

    /////////////////////////////////////////////////
    // ON RÉCUPÈRE L'IDENTIFIANT SAISIE DANS LE FORMULAIRE
    req.session.identifiant = req.body.identifiant;
    logger.info("identifiant saisi : " + req.body.identifiant, { numsession: req.session.id, label: filename});

    // ON REGARDE S'il à bien rempli l'identifiant et s'il a coché la case "je ne suis pas adhérent"
    if (req.body.identifiant  && req.body.check_nonadherent) {
        req.session.err_mail_form_adhesion_1 = "Pour vous inscrire au rassemblement, vous devez au préalable être adhérent à l'Association Française pour la Pédagogie Suzuki (AFPS).";
        req.session.err_mail_form_adhesion_2 = 'Si vous faites partie d\'une association non française veulliez cocher la case "Je suis adhérent à une Association Suzuki dans un autre pays en renseignant votre identifiant ou votre mail.';
        req.session.err_mail_form_adhesion_3 = 'Pour adhérer <a target="_blank" href="https://www.inscription.afpedagogiesuzuki.fr/adhesion/"><span class="souligne">Cliquez ici</span></a>';
        res.redirect('/rassemblementidf/identifier');
    }
    if (!req.body.identifiant  && req.body.check_nonadherent) {
        req.session.err_mail_form_adhesion_1 = "Pour vous inscrire au rassemblement, vous devez au préalable être adhérent à l'Association Française pour la Pédagogie Suzuki (AFPS).";
        req.session.err_mail_form_adhesion_2 = 'Si vous faites partie d\'une association non française veulliez cocher la case "Je suis adhérent à une Association Suzuki dans un autre pays en renseignant votre identifiant ou votre mail.';
        req.session.err_mail_form_adhesion_3 = 'Pour adhérer <a target="_blank" href="https://www.inscription.afpedagogiesuzuki.fr/adhesion/"><span class="souligne">Cliquez ici</span></a>';
        res.redirect('/rassemblementidf/identifier');
    }
    if (!req.body.identifiant  && !req.body.check_nonadherent) {
        req.session.err_mail_form_adhesion_1 = "Veuillez entrer votre identifiant AFPS<br>(Association Française pour la Pédagogie Suzuki),<br><br>ou l'identifiant d'adhésion à votre Association Nationale Suzuki.";
        req.session.err_mail_form_adhesion_2 = "Si vous n'êtes pas encore adhérent, vous pouvez adhérer en";
        req.session.err_mail_form_adhesion_3 = '<a target="_blank" href="https://www.inscription.afpedagogiesuzuki.fr/adhesion/"><span class="souligne">Cliquez ici</span></a>';
        res.redirect('/rassemblementidf/identifier');
    }

    // SAISIE OK ON PEUT CONTINUER
    if (req.body.identifiant && !req.body.check_nonadherent) {

        // EST-CE QUE L'IDENTIFIANT SAISI EST DÉJA INSCRIT AU RASSEMBLEMENT TABLE ras_adherent
        // CONNECTION DB PROMISE
        // TRY 2
        try {
            //Connexion
            const db_connection_promise = await connect_DB_promise();
            //Query
            let sql = 'select identifiant, association_suzuki, adherent_mail from ras_adherent where identifiant = "' + req.session.identifiant + '" AND lieu = "IDF" AND saison = "' + process.env.SAISON + '" AND statut_suppression = 0';
 
            logger.info("sql ras_adherent  : " + sql, { numsession: req.session.id, label: filename});
            const [results_checkinscrit, fields] = await db_connection_promise.execute(sql);
            await db_connection_promise.end();
            logger.info("TABLE ras_adherent nombre de row avec identifiant saisie : " + results_checkinscrit.length, { numsession: req.session.id, label: filename});

            if (results_checkinscrit.length) {
                // DÉJA INSCRIT AU RASSEMBLEMENT
                logger.info("Identifant déjà inscrit au RASSEMBLEMENT : " + req.session.identifiant, { numsession: req.session.id, label: filename});
                // ON AFFICHE LA PAGE DE SAISIE DE L'IDENTIFIANT AVEC ERREUR "déjà inscrit"
                req.session.err_mail_form_adhesion_1 = "L'identifiant <strong>" + req.session.identifiant + "</strong> est déjà inscrit au rassemblement.";
                res.redirect('/rassemblementidf/identifier');
            } else {
                // NON INSCRIT AU RASSEMBLEMENT
                logger.info("Identifant non inscrit au rassemblement : "+req.session.identifiant, { numsession: req.session.id, label: filename});
                
                // IDENTIFIANT SAISIE ET CASE AUTRE PAYS COCHÉ
                // ON AFFICHE LA PAGE DU FORMULAIRE DE SAISIE DES INFORMATIONS DE L'INSCRIPTION
                if (req.body.identifiant && !req.body.check_nonadherent && req.body.check_autrepays) {
                    req.session.association_suzuki = "autre pays";
                    res.redirect('/rassemblementidf/formulaire');
                } else {
                    /////////////////////////////////////////////////
                    // RECHERCHE SI PERSONNE EST ADHÉRENTE À L'AFPS
                    // DANS BD ADHESION adherent
                    sql = 'select identifiant,association_suzuki from adherent where identifiant = "' + req.session.identifiant + '"';
                    const retour_checkAdherent = await checkAdherent(sql);
                    if (retour_checkAdherent.error) {
                        logger.info("Il y a un problème avec la connection à la base de données adherent ! : " + retour_checkAdherent.error, { numsession: req.session.id, label: filename});
                        req.session.err_mail_form_adhesion_1 = "Il y a un problème système connexion base de données, veuillez recommencer." + retour_checkAdherent.error;
                        res.redirect('/rassemblementidf/identifier');
                    } else if (retour_checkAdherent.found) {
                        // LA PERSONNE EST BIEN ADHÉRENTE
                        req.session.association_suzuki = retour_checkAdherent.results_checkAdherent.association_suzuki;
                        logger.info("req.session.association_suzuki : " + retour_checkAdherent.results_checkAdherent.association_suzuki, { numsession: req.session.id, label: filename});
                        // ON AFFICHE LA PAGE DU FORMULAIRE DE SAISIE DES INFORMATIONS DE L'INSCRIPTION
                        res.redirect('/rassemblementidf/formulaire');
                    } else {
                        // LA PERSONNE N'EST PAS ADHÉRENTE
                        logger.info("Identifant NON adhérent : " + req.session.identifiant, { numsession: req.session.id, label: filename});
                        req.session.err_mail_form_adhesion_1 = "L'identifiant saisi n'est pas reconnu comme adhérent de l'Association Française pour la Pédagogie Suzuki (AFPS) pour 2025/2026.";
                        req.session.err_mail_form_adhesion_2 = 'Vous devez adhérer avant de vous inscrire au rassemblement. <br>Si vous êtes membre d\'une association Suzuki non française, veuillez cocher la case "Je suis adhérent à une Association Suzuki dans un autre pays" et renseigner votre identifiant ou votre adresse e-mail.';
                        req.session.err_mail_form_adhesion_3 = 'Pour adhérer à l\'Association Française pour la Pédagogie Suzuki, <a target="_blank" href="https://www.inscription.afpedagogiesuzuki.fr/adhesion/"><span class="souligne">cliquez ici</span></a>';
                        res.redirect('/rassemblementidf/identifier');
                    }
                }
            }

        } catch (error) {
            // Echec de connection à la BD
            logger.error("Il y a un problème avec la connection à la base de données ras_adherent (TRY 2) : " + error, { numsession: req.session.id });
            req.session.err_mail_form_adhesion_1 = "Il y a un problème système connexion base de données, veuillez recommencer.";
            res.redirect('/rassemblementidf/identifier');
        }
    }

}

const RI_checkinfos = async function(req, res) {

    logger.info("======================================");
    logger.info("======== FUNCTION RI_checkinfos ==========");
    logger.info("======================================");

    // RÉCUPÉRATION DES DONNÉES DU FORMULAIRE DANS LA SESSION EN COURS
    if (req.body.association) {req.session.association_suzuki = req.body.association;};
    
    if (req.body.adherent_nom) {req.session.adherent_nom = req.body.adherent_nom;};
    logger.info("req.session.adherent_nom : " + req.session.adherent_nom, { numsession: req.session.id, label: filename });
    if (req.body.adherent_prenom) {req.session.adherent_prenom = req.body.adherent_prenom;};
    if (req.body.adherent_adresse_rue) {req.session.adherent_adresse_rue = req.body.adherent_adresse_rue;};
    if (req.body.adherent_adresse_complement) {req.session.adherent_adresse_complement = req.body.adherent_adresse_complement;};
    logger.info("req.body.adherent_adresse_complement : " + req.body.adherent_adresse_complement, { numsession: req.session.id, label: filename });
    logger.info("req.session.adherent_adresse_complement : " + req.session.adherent_adresse_complement, { numsession: req.session.id, label: filename });
    if (req.body.adherent_adresse_codepostal) {req.session.adherent_adresse_codepostal = req.body.adherent_adresse_codepostal;};
    if (req.body.adherent_adresse_ville) {req.session.adherent_adresse_ville = req.body.adherent_adresse_ville;};
    if (req.body.adherent_adresse_pays) {req.session.adherent_adresse_pays = req.body.adherent_adresse_pays;};
    if (req.body.adherent_telephone_mobile) {req.session.adherent_telephone_mobile = req.body.adherent_telephone_mobile;};
    if (req.body.adherent_telephone_fixe) {req.session.adherent_telephone_fixe = req.body.adherent_telephone_fixe;};
    if (req.body.adherent_mail) {req.session.adherent_mail = req.body.adherent_mail;};
    if (req.body.bus_nb) {req.session.bus_nb = req.body.bus_nb;};

    if (req.body.commentaire_adherent) {req.session.commentaire_adherent = req.body.commentaire_adherent;};

    //// INITIALISATION DES MONTANTS PAR FAMILLE
    req.session.cout_rassemblement = 0;
    req.session.cout_repas = 0;
    req.session.accompte_frais_bancaire = 0;
    req.session.cout_total = 0;
    var nbr_eleve = 0;
    var nbr_repas = 0;

    for (let toto = 1; toto < 7; toto++) {
        if (req.body["personne_" + toto + "_nom"]) { req.session["personne_" + toto + "_nom"] = req.body["personne_" + toto + "_nom"]; }
        if (req.body["personne_" + toto + "_prenom"]) { req.session["personne_" + toto + "_prenom"] = req.body["personne_" + toto + "_prenom"]; }
        if (req.body["personne_" + toto + "_datenaissance"]) { req.session["personne_" + toto + "_datenaissance"] = req.body["personne_" + toto + "_datenaissance"]; }
        if (req.body["personne_" + toto + "_role"]) { req.session["personne_" + toto + "_role"] = req.body["personne_" + toto + "_role"]; }
        if (req.body["personne_" + toto + "_instrument"]) { req.session["personne_" + toto + "_instrument"] = req.body["personne_" + toto + "_instrument"]; }
        if (req.body["personne_" + toto + "_cahier"]) { req.session["personne_" + toto + "_cahier"] = req.body["personne_" + toto + "_cahier"]; }
        if (req.body["personne_" + toto + "_piece"]) { req.session["personne_" + toto + "_piece"] = req.body["personne_" + toto + "_piece"]; }
        if (req.body["personne_" + toto + "_prof"]) { req.session["personne_" + toto + "_prof"] = req.body["personne_" + toto + "_prof"]; }
        if (req.body["personne_" + toto + "_repas"]) { req.session["personne_" + toto + "_repas"] = req.body["personne_" + toto + "_repas"]; }

        logger.info('req.session["personne_"'+toto+'"_prenom"] = ' + req.session["personne_"+toto+"_prenom"], { numsession: req.session.id, label: filename });
        logger.info('req.body["personne_"+toto+"_cahier"] = ' + req.body["personne_"+toto+"_cahier"], { numsession: req.session.id, label: filename });
        logger.info('req.session["personne_"+toto+"_cahier"] = ' + req.session["personne_"+toto+"_cahier"], { numsession: req.session.id, label: filename });
        logger.info('req.session["personne_"+toto+"_prof"] = ' + req.session["personne_"+toto+"_prof"], { numsession: req.session.id, label: filename });
        
        // CALCUL ÂGE PERSONNE 
        if (req.session["personne_"+toto+"_datenaissance"]) {
            let datenaissance_concat = req.session["personne_"+toto+"_datenaissance"];

            var an=datenaissance_concat.substr(6,4); // l'année (les quatre premiers caractères de la chaîne à partir de 6)
            var mois=datenaissance_concat.substr(3,2);// On selectionne le mois de la date de naissance
            var day= datenaissance_concat.substr(0,2); // On selectionne la jour de la date de naissance
            var birthDate = new Date(an + "-" + mois + "-" + day);
            var debutrassemblement = new Date('2026-04-19');
            var age = debutrassemblement.getFullYear() - birthDate.getFullYear();
            var m = debutrassemblement.getMonth() - birthDate.getMonth();
            if (m < 0 || (m === 0 && debutrassemblement.getDate() < birthDate.getDate())) {
                age--;
            }
            req.session["personne_"+toto+"_age"] = age;
            logger.info('req.session["personne_"+toto+"_age"] = ' + req.session["personne_"+toto+"_age"], { numsession: req.session.id, label: filename });
            
            //// +1 nombre d'élève
            if (req.session["personne_"+toto+"_role"] === "instrumentiste") {
                nbr_eleve++;
            }            
        }

        //// +1 repas
        if (req.session["personne_"+toto+"_role"] === "professeur" && req.session["personne_"+toto+"_repas"] === "repas") {
            nbr_repas++;
        }
    }
    
    ///// CALCUL COUT TOTAL
    logger.info('nbr_eleve TOTAL : ' + nbr_eleve, { numsession: req.session.id, label: filename });
    if (nbr_eleve == 1){
        req.session.cout_rassemblement = 31;
        req.session.cout_total += req.session.cout_rassemblement;
    };
    if (nbr_eleve > 1){
        req.session.cout_rassemblement = 51;
        req.session.cout_total += req.session.cout_rassemblement;
    }
    if (nbr_repas > 0) {
        req.session.cout_repas = 8*nbr_repas;
        req.session.cout_total += req.session.cout_repas;
    }
    
    if (req.session.cout_total > 0) {
        req.session.accompte_frais_bancaire = 1;
        req.session.cout_total += req.session.accompte_frais_bancaire;
    }
    

    logger.info('req.session.cout_rassemblement : ' + req.session.cout_rassemblement, { numsession: req.session.id, label: filename });
    logger.info('req.session.cout_repas : ' + req.session.cout_repas, { numsession: req.session.id, label: filename });
    logger.info('req.session.accompte_frais_bancaire : ' + req.session.accompte_frais_bancaire, { numsession: req.session.id, label: filename });
    logger.info('req.session.cout_total : ' + req.session.cout_total, { numsession: req.session.id, label: filename });
    res.redirect('/rassemblementidf/recap');



}

const post_recap_modifier = async function(req, res) {
    res.redirect('/rassemblementidf/identifier');
}

const post_payer_ri = async function(req, res) {
    logger.info("======================================");
    logger.info("======== FUNCTION post_payer_ri ==========");
    logger.info("======================================");

    // VARIABLES
    /////////////////////////////////////////////////
    let saison = process.env.SAISON;
    moment.locale('fr');
    let now = moment().format("YYYY-MM-DD HH:mm:ss");
    let sql;
    let table;
    let champs;
    let values;

    /////////////////////////////////////////////////
    // SI IDENTIFIANT PERDU
    /////////////////////////////////////////////////
    logger.info("req.session.identifiant : " + req.session.identifiant , { numsession: req.session.id, label: filename});
    if (req.session.identifiant === undefined) {
        logger.info("IDENTIFIANT PERDU", { numsession: req.session.id });
        req.session.err_mail_form_adhesion_1 = "Session expirée, veuillez recommencer";
        res.redirect('/rassemblementidf/identifier');
    } else {

        /////////////////////////////////////////////////
        // RÉCUPÉRATION ACCOMPAGNANT
        if (req.body.accompagnant_nom) {req.session.accompagnant_nom = req.body.accompagnant_nom;};
        if (req.body.accompagnant_prenom) {req.session.accompagnant_prenom = req.body.accompagnant_prenom;};

        /////////////////////////////////////////////////
        // AJOUT DANS LA BASE DE DONNÉES

        // TRY 3
        try {
            //Connexion
            let db_connection_promise = await connect_DB_promise();

            /////////////////////////////////////////////////
            // AJOUT PARTICIPANTS
            for (let toto = 1; toto < 7; toto++) {
                if (req.session["personne_"+toto+"_nom"]) {

                    // QUERY ADD ras_participant
                    table = "ras_participant";
                    if (req.session["personne_" + toto + "_role"] === "professeur") {
                        champs = "lieu, saison, identifiant, date_maj, ras_part_nom, ras_part_prenom, ras_part_date_naiss, ras_part_age, ras_part_role, instrument, repas_prof, statut_suppression";
                        values = '"IDF", "'+process.env.SAISON+'", "' + req.session.identifiant + '", "' + now + '", "' + req.session["personne_" + toto + "_nom"] + '", "' + req.session["personne_" + toto + "_prenom"] + '", "' + req.session["personne_" + toto + "_datenaissance"] + '", "' + req.session["personne_" + toto + "_age"] + '", "' + req.session["personne_" + toto + "_role"] + '", "' + req.session["personne_" + toto + "_instrument"] + '", "' + req.session["personne_" + toto + "_repas"] + '", 0';
                    }
                    
                    if (req.session["personne_" + toto + "_role"] === "instrumentiste") {
                        champs = "lieu, saison, identifiant, date_maj, ras_part_nom, ras_part_prenom, ras_part_date_naiss, ras_part_age, ras_part_role, instrument, cahier, piece, prof_nom, statut_suppression";
                        values = '"IDF", "'+process.env.SAISON+'", "' + req.session.identifiant + '", "' + now + '", "' + req.session["personne_" + toto + "_nom"] + '", "' + req.session["personne_" + toto + "_prenom"] + '", "' + req.session["personne_" + toto + "_datenaissance"] + '", "' + req.session["personne_" + toto + "_age"] + '", "' + req.session["personne_" + toto + "_role"] + '", "' + req.session["personne_" + toto + "_instrument"] + '", "' + req.session["personne_" + toto + "_cahier"] + '", "' + req.session["personne_" + toto + "_piece"] + '", "' + req.session["personne_" + toto + "_prof"] + '", 0';
                    }
                    sql = 'INSERT INTO ' + table + ' (' + champs + ') VALUES (' + values + ')';
                    logger.info("REQUETE SQL INSERT INTO ras_participant : " + sql , { numsession: req.session.id, label: filename});
                    const [results_ras_participant, fields] = await db_connection_promise.execute(sql);
                    logger.info("ras_participant Row ID added : " + results_ras_participant.insertId, { numsession: req.session.id, label: filename});
                }
            }

            /////////////////////////////////////////////////
            // AJOUT DB ADHÉRENTS
            // QUERY ADD ras_adherent
            if (!req.session.bus_nb) {req.session.bus_nb = 0};
            table = "ras_adherent";
            champs = "lieu, identifiant, association_suzuki, saison, date_maj, adherent_nom, adherent_prenom, adherent_telephone, adherent_mail, adherent_adresse_rue, adherent_adresse_complement, adherent_adresse_codepostal, adherent_adresse_ville, adherent_adresse_pays, ras_commentaire, accompagnant_nom, accompagnant_prenom, bus_nb, tarif_rassemblement, cout_repas_prof, frais_bancaire, cout_total, statut_paiement, statut_suppression";
            values = '"IDF", "' + req.session.identifiant + '", "' + req.session.association_suzuki + '", "' + saison + '", "' + now + '", "' + req.session.adherent_nom + '", "' + req.session.adherent_prenom + '", "' + req.session.adherent_telephone_mobile + '", "' + req.session.adherent_mail + '", "' + req.session.adherent_adresse_rue + '", "' + req.session.adherent_adresse_complement + '", "' + req.session.adherent_adresse_codepostal + '", "' + req.session.adherent_adresse_ville + '", "' + req.session.adherent_adresse_pays + '", "' + req.session.commentaire_adherent + '", "' + req.session.accompagnant_nom + '", "' + req.session.accompagnant_prenom + '",' + req.session.bus_nb + ',' + req.session.cout_rassemblement + ',' + req.session.cout_repas + ',' + req.session.accompte_frais_bancaire + ',' + req.session.cout_total + ',"attente",0';
            sql = 'INSERT INTO ' + table + ' (' + champs + ') VALUES (' + values + ')';

            logger.info("REQUETE SQL INSERT INTO ras_adherent : " + sql , { numsession: req.session.id, label: filename});
            const [results_ras_adherent, fields] = await db_connection_promise.execute(sql);
            logger.info("ras_adherent Row ID added : " + results_ras_adherent.insertId, { numsession: req.session.id, label: filename});

            await db_connection_promise.end();

            if (req.session.cout_total > 1) {
                /////////////////////////////////////////////////
                // STRIPE - ETAPE 1 - CREER l'INTENTION DE PAIEMENT

                logger.info("======================================", { label: filename });
                logger.info("======== ENVOIE VERS STRIPE ==========", { label: filename });
                logger.info("======================================", { label: filename });

                const session = await stripe.checkout.sessions.create({
                    metadata: {identifiant: req.session.identifiant, cout_rassemblement: req.session.cout_rassemblement, accompte_frais_bancaire: req.session.accompte_frais_bancaire},
                    customer_email: req.session.adherent_mail,
                    
                    submit_type: 'pay',
                    
                    success_url: process.env.STRIPE_RI_SUCCESSURL,
                    cancel_url: process.env.STRIPE_RI_CANCELURL,

                    payment_method_types: ['card'],
                    line_items: [{
                        price_data: {
                        currency: 'eur',
                        product_data: {
                            name: 'Rassemblement IDF',
                        },
                        unit_amount: req.session.cout_total * 100,
                        },
                        quantity: 1,
                    },],
                    //Checkout has three modes: payment, subscription, or setup. 
                    mode: 'payment'
            
                });
                res.redirect(session.url)
            }


        }  catch (error) {
            // Echec de connection à la BD
            logger.error("Il y a un problème avec la connection à la base de données (TRY 3) : " + error, { numsession: req.session.id });
            req.session.err_mail_form_adhesion_1 = '"Il y a un problème système connexion base de données, veuillez recommencer, "' + error;
            res.redirect('/rassemblementidf/identifier');
        }
    }

}

const RI_accompte_reussi = async function(req, res) {

    logger.info("======================================", { label: filename });
    logger.info("======== FUNCTION RI_accompte_reussi ==========", { label: filename });
    logger.info("======================================", { label: filename });

    // VARIABLES
    let CB_retour;
    let stripe_retour;

    // DATE
    moment().format();
    moment.locale('fr');

    //////////////////////////////////////////////////////////////////////////////
    // RETOUR STRIPE
    let id = req.query.id;
    const session_stripe = await stripe.checkout.sessions.retrieve(id);
    let customer_email = session_stripe.customer_email;
    req.session.adherent_mail = customer_email;
    let payment_status = session_stripe.payment_status;
    let amount_total = session_stripe.amount_total/100;
    let stripe_customer = session_stripe.customer;
    let stripe_payment_intent = session_stripe.payment_intent;
    let payment_method_types = session_stripe.payment_method_types;
    let stripe_status = session_stripe.status;
    let identifiant = session_stripe.metadata.identifiant;
    req.session.identifiant = identifiant;
    CB_retour = payment_status + ", " + stripe_customer + ", " + stripe_payment_intent + ", " + session_stripe.id + ", " + payment_method_types + ", " + stripe_status;
    stripe_retour = session_stripe.id;
    logger.info("customer_email : " + customer_email, { numsession: req.session.id, label: filename});
    logger.info("payment_status : " + payment_status, { numsession: req.session.id, label: filename});

    //////////////////////////////////////////////////////////////////////////////
    // MAJ infos paiements DB
    /////////////////////////////////////////////////

    // une vérification pour ne pas ajouter plusieurs fois le même participant en cas de rafraîchissement de la page
    logger.info("req.session.participant_ajoute : " + req.session.participant_ajoute, { numsession: req.session.id, label: filename});

    if (req.session.participant_ajoute === "oui") {
        req.session.err_mail_form_adhesion_1 = "Votre session est terminée, les participants ont déjà été ajoutés.";
        res.redirect('/rassemblementidf/identifier');
    } else {

        // Query MAJ infos paiements DB 
        // TRY 1
        try {

            let db_connection_promise = await connect_DB_promise();
            let sql = 'UPDATE ';
            sql += 'ras_adherent';
            sql += ' SET ';
            sql += 'stripe_retour = "' + CB_retour + '", ';
            sql += 'statut_paiement = "paye" ';
            sql += ' WHERE identifiant = "' + req.session.identifiant + '" AND lieu = "IDF" AND saison = "'+process.env.SAISON+'" AND statut_suppression = 0';

            logger.info("sql UPDATE ras_adherent : " + sql, { numsession: req.session.id, label: filename});
            const [results, fields] = await db_connection_promise.execute(sql);
            logger.info("Row ras_adherent UPDATE payé: " + results.changedRows, { numsession: req.session.id, label: filename});

            //////////////////////////////////////////////////////////////////////////////
            // Query Récupération des infos pour copie dans Google Sheet + envoie du mail
            // adhérent
            let sql2 = 'select * from  ';
            sql2 += 'ras_adherent';
            sql2 += ' WHERE identifiant = "' + req.session.identifiant + '" AND statut_suppression = 0 AND lieu = "IDF" AND saison = "' + process.env.SAISON + '"';
            const [results2, fields2] = await db_connection_promise.execute(sql2);
            logger.info("Row ras_adherent SELECT : " + results2.length, { numsession: req.session.id, label: filename});

            // participants
            let sql3 = 'SELECT DISTINCT ras_adherent.identifiant, ras_adherent.association_suzuki, ras_adherent.saison, ras_adherent.date_maj, ras_adherent.adherent_nom, ras_adherent.adherent_prenom, ras_adherent.adherent_telephone, ras_adherent.adherent_mail, ras_participant.ID_participant, ras_participant.ras_part_nom, ras_participant.ras_part_prenom, ras_participant.ras_part_date_naiss, ras_participant.ras_part_role, ras_participant.ras_part_age, ras_participant.instrument, ras_participant.cahier, ras_participant.piece, ras_participant.prof_nom, ras_participant.repas_prof FROM ras_participant JOIN ras_adherent ON ras_participant.identifiant = ras_adherent.identifiant WHERE ras_participant.identifiant = "' + req.session.identifiant + '" AND ras_participant.statut_suppression = 0 AND ras_participant.lieu = "IDF" AND ras_participant.saison = "' + process.env.SAISON + '"';
            const [results3, fields3] = await db_connection_promise.execute(sql3);
            await db_connection_promise.end();
            logger.info("Row ras_participant SELECT nombre de participants : " + results3.length, { numsession: req.session.id, label: filename});
            
            //////////////////////////////////////////////////////////////////////////////
            // PRÉPARATION PAGE PAIEMENT RÉUSSI
            res.locals.identifiant = req.session.identifiant;
            res.locals.association_suzuki = results2[0].association_suzuki;
            res.locals.bus_nb = results2[0].bus_nb;
            res.locals.accompagnant_prenom = results2[0].accompagnant_prenom;
            res.locals.accompagnant_nom = results2[0].accompagnant_nom;

            for (let toto = 0; toto < (results3.length); toto++) {
                res.locals["personne_"+toto+"_numero"] = toto;
                res.locals["personne_"+toto+"_nom"] = results3[toto].ras_part_nom.toUpperCase();
                res.locals["personne_"+toto+"_prenom"] = results3[toto].ras_part_prenom;
                res.locals["personne_"+toto+"_role"] = results3[toto].ras_part_role;
                res.locals["personne_"+toto+"_instrument"] = results3[toto].instrument;
                res.locals["personne_"+toto+"_cahier"] = results3[toto].cahier;
                res.locals["personne_"+toto+"_piece"] = results3[toto].piece;
                res.locals["personne_"+toto+"_prof"] = results3[toto].prof_nom;
                res.locals["personne_"+toto+"_repas"] = results3[toto].repas_prof;
            }
            res.locals.cout_total = results2[0].cout_total;
            res.locals.frais_bancaire = results2[0].frais_bancaire;
            res.locals.tarif_rassemblement = results2[0].tarif_rassemblement;
            res.locals.cout_repas = results2[0].cout_repas_prof;

            //////////////////////////////////////////////////////////////////////////////
            // AJOUT INFOS DANS GOOGLE SHEET
            // TRY 4
            try {

                await GS_rassemblementidf.useServiceAccountAuth(GS_creds_rassemblementidf);
                await GS_rassemblementidf.loadInfo();
                let GS_rassemblementidf_Adherents = GS_rassemblementidf.sheetsByTitle['Adherents'];
                let GS_rassemblementidf_Paiements = GS_rassemblementidf.sheetsByTitle['Paiements'];
                let GS_rassemblementidf_NAVETTE = GS_rassemblementidf.sheetsByTitle['NAVETTE'];
                let GS_rassemblementidf_Instrumentistes = GS_rassemblementidf.sheetsByTitle['Instrumentistes'];
                let GS_rassemblementidf_Professeurs = GS_rassemblementidf.sheetsByTitle['Professeurs'];
                let GS_rassemblementidf_Repas = GS_rassemblementidf.sheetsByTitle['Repas'];
                let GS_rassemblementidf_VIOLON = GS_rassemblementidf.sheetsByTitle['VIOLON'];
                let GS_rassemblementidf_ALTO = GS_rassemblementidf.sheetsByTitle['ALTO'];
                let GS_rassemblementidf_VIOLONCELLE = GS_rassemblementidf.sheetsByTitle['VIOLONCELLE'];
                let GS_rassemblementidf_HARPE = GS_rassemblementidf.sheetsByTitle['HARPE'];
                let GS_rassemblementidf_PIANO = GS_rassemblementidf.sheetsByTitle['PIANO'];

                if (results2[0].accompagnant_nom === "undefined") {results2[0].accompagnant_nom = ""};
                if (results2[0].accompagnant_prenom === "undefined") {results2[0].accompagnant_prenom = ""};

                await GS_rassemblementidf_Adherents.addRows (
                    [
                        {
                            ID_adherent: results2[0].ID_adherent,
                            saison: results2[0].saison,
                            identifiant: req.session.identifiant,
                            association_suzuki: results2[0].association_suzuki,
                            date: moment(results2[0].date_maj).format("YYYY-MM-DD HH:mm:ss"),
                            adherent_nom: results2[0].adherent_nom.toUpperCase(),
                            adherent_prenom: results2[0].adherent_prenom,
                            adherent_mail: results2[0].adherent_mail,
                            adherent_telephone: "'" + results2[0].adherent_telephone,
                            adherent_adresse_rue: results2[0].adherent_adresse_rue,
                            adherent_adresse_complement: results2[0].adherent_adresse_complement,
                            adherent_adresse_codepostal: results2[0].adherent_adresse_codepostal,
                            adherent_adresse_ville: results2[0].adherent_adresse_ville,
                            adherent_adresse_pays: results2[0].adherent_adresse_pays,
                            accompagnant_nom: results2[0].accompagnant_nom,
                            accompagnant_prenom: results2[0].accompagnant_prenom,
                            commentaire: results2[0].ras_commentaire
                        }
                    ]
                );

                await GS_rassemblementidf_Paiements.addRows (
                    [
                        {
                            ID_adherent: results2[0].ID_adherent,
                            identifiant: req.session.identifiant,
                            adherent_nom: results2[0].adherent_nom.toUpperCase(),
                            adherent_prenom: results2[0].adherent_prenom,
                            adherent_mail: results2[0].adherent_mail,
                            tarif_rassemblement: parseFloat(results2[0].tarif_rassemblement),
                            cout_repas_prof: parseFloat(results2[0].cout_repas_prof),
                            frais_bancaire: parseFloat(results2[0].frais_bancaire),
                            cout_total: parseFloat(results2[0].cout_total),
                            statut_paiement: results2[0].statut_paiement
                        }
                    ]
                );

                if (results2[0].bus_nb > 0) {
                    await GS_rassemblementidf_NAVETTE.addRows (
                        [
                            {
                                ID_adherent: results2[0].ID_adherent,
                                identifiant: req.session.identifiant,
                                adherent_nom: results2[0].adherent_nom.toUpperCase(),
                                adherent_prenom: results2[0].adherent_prenom,
                                adherent_telephone: "'" + results2[0].adherent_telephone,
                                bus_nb : results2[0].bus_nb
                            }
                        ]
                    );
                }

                let ajout_instrumentistes = [];
                let instruments_trouve = "";
                for (let i = 0; i < results3.length; i++) {
                    if (results3[i].ras_part_role === "instrumentiste") {
                        ajout_instrumentistes.push({
                            ID_participant: results3[i].ID_participant,
                            identifiant: req.session.identifiant,
                            participant_nom: results3[i].ras_part_nom.toUpperCase(),
                            participant_prenom: results3[i].ras_part_prenom,
                            participant_age: results3[i].ras_part_age,
                            adherent_mail: results3[i].adherent_mail,
                            adherent_telephone: "'" + results3[i].adherent_telephone,
                            instrument: results3[i].instrument,
                            cahier: results3[i].cahier,
                            piece: results3[i].piece,
                            prof_nom: results3[i].prof_nom
                        });
                        instruments_trouve = "oui";
                    }
                }
                if (instruments_trouve === "oui") { await GS_rassemblementidf_Instrumentistes.addRows(ajout_instrumentistes);}

                let ajout_professeur = [];
                let professeur_trouve = "";
                for (let i = 0; i < results3.length; i++) {
                    if (results3[i].ras_part_role === "professeur") {
                        ajout_professeur.push({
                            ID_participant: results3[i].ID_participant,
                            identifiant: req.session.identifiant,
                            participant_nom: results3[i].ras_part_nom.toUpperCase(),
                            participant_prenom: results3[i].ras_part_prenom,
                            participant_age: results3[i].ras_part_age,
                            adherent_mail: results3[i].adherent_mail,
                            adherent_telephone: "'" + results3[i].adherent_telephone,
                            instrument: results3[i].instrument,
                            repas: results3[i].repas_prof
                        });
                        professeur_trouve = "oui";
                    }
                }
                if (professeur_trouve === "oui") { await GS_rassemblementidf_Professeurs.addRows(ajout_professeur);}

                let ajout_repas = [];
                let repas_trouve = "";
                for (let i = 0; i < results3.length; i++) {
                    if (results3[i].repas_prof === "repas") {
                        ajout_repas.push({
                            ID_participant: results3[i].ID_participant,
                            identifiant: req.session.identifiant,
                            participant_nom: results3[i].ras_part_nom.toUpperCase(),
                            participant_prenom: results3[i].ras_part_prenom,
                            adherent_mail: results3[i].adherent_mail,
                            adherent_telephone: "'" + results3[i].adherent_telephone,
                            repas: results3[i].repas_prof
                        });
                        repas_trouve = "oui";
                    }
                }
                if (repas_trouve === "oui") { await GS_rassemblementidf_Repas.addRows(ajout_repas);}

                let ajout_violon = [];
                let violon_trouve = "";
                for (let i = 0; i < results3.length; i++) {
                    if (results3[i].ras_part_role === "instrumentiste" && results3[i].instrument === "violon") {
                        ajout_violon.push({
                            ID_participant: results3[i].ID_participant,
                            identifiant: req.session.identifiant,
                            participant_nom: results3[i].ras_part_nom.toUpperCase(),
                            participant_prenom: results3[i].ras_part_prenom,
                            participant_age: results3[i].ras_part_age,
                            adherent_mail: results3[i].adherent_mail,
                            adherent_telephone: "'" + results3[i].adherent_telephone,
                            instrument: results3[i].instrument,
                            cahier: results3[i].cahier,
                            piece: results3[i].piece,
                            prof_nom: results3[i].prof_nom
                        });
                        violon_trouve = "oui";
                    }
                
                }
                if (violon_trouve === "oui") { await GS_rassemblementidf_VIOLON.addRows(ajout_violon);}

                let ajout_alto = [];
                let alto_trouve = "";
                for (let i = 0; i < results3.length; i++) {
                    if (results3[i].ras_part_role === "instrumentiste" && results3[i].instrument === "alto") {
                        ajout_alto.push({
                            ID_participant: results3[i].ID_participant,
                            identifiant: req.session.identifiant,
                            participant_nom: results3[i].ras_part_nom.toUpperCase(),
                            participant_prenom: results3[i].ras_part_prenom,
                            participant_age: results3[i].ras_part_age,
                            adherent_mail: results3[i].adherent_mail,
                            adherent_telephone: "'" + results3[i].adherent_telephone,
                            instrument: results3[i].instrument,
                            cahier: results3[i].cahier,
                            piece: results3[i].piece,
                            prof_nom: results3[i].prof_nom
                        });
                        alto_trouve = "oui";
                    }
                
                }
                if (alto_trouve === "oui") { await GS_rassemblementidf_ALTO.addRows(ajout_alto);}

                let ajout_violoncelle = [];
                let violoncelle_trouve = "";
                for (let i = 0; i < results3.length; i++) {
                    if (results3[i].ras_part_role === "instrumentiste" && results3[i].instrument === "violoncelle") {
                        ajout_violoncelle.push({
                            ID_participant: results3[i].ID_participant,
                            identifiant: req.session.identifiant,
                            participant_nom: results3[i].ras_part_nom.toUpperCase(),
                            participant_prenom: results3[i].ras_part_prenom,
                            participant_age: results3[i].ras_part_age,
                            adherent_mail: results3[i].adherent_mail,
                            adherent_telephone: "'" + results3[i].adherent_telephone,
                            instrument: results3[i].instrument,
                            cahier: results3[i].cahier,
                            piece: results3[i].piece,
                            prof_nom: results3[i].prof_nom
                        });
                        violoncelle_trouve = "oui";
                    }
                
                }
                if (violoncelle_trouve === "oui") { await GS_rassemblementidf_VIOLONCELLE.addRows(ajout_violoncelle);}

                let ajout_harpe = [];
                let harpe_trouve = "";
                for (let i = 0; i < results3.length; i++) {
                    if (results3[i].ras_part_role === "instrumentiste" && results3[i].instrument === "harpe") {
                        ajout_harpe.push({
                            ID_participant: results3[i].ID_participant,
                            identifiant: req.session.identifiant,
                            participant_nom: results3[i].ras_part_nom.toUpperCase(),
                            participant_prenom: results3[i].ras_part_prenom,
                            participant_age: results3[i].ras_part_age,
                            adherent_mail: results3[i].adherent_mail,
                            adherent_telephone: "'" + results3[i].adherent_telephone,
                            instrument: results3[i].instrument,
                            cahier: results3[i].cahier,
                            piece: results3[i].piece,
                            prof_nom: results3[i].prof_nom
                        });
                        harpe_trouve = "oui";
                    }
                
                }
                if (harpe_trouve === "oui") { await GS_rassemblementidf_HARPE.addRows(ajout_harpe);}

                let ajout_piano = [];
                let piano_trouve = "";
                for (let i = 0; i < results3.length; i++) {
                    if (results3[i].ras_part_role === "instrumentiste" && results3[i].instrument === "piano") {
                        ajout_piano.push({
                            ID_participant: results3[i].ID_participant,
                            identifiant: req.session.identifiant,
                            participant_nom: results3[i].ras_part_nom.toUpperCase(),
                            participant_prenom: results3[i].ras_part_prenom,
                            participant_age: results3[i].ras_part_age,
                            adherent_mail: results3[i].adherent_mail,
                            adherent_telephone: "'" + results3[i].adherent_telephone,
                            instrument: results3[i].instrument,
                            cahier: results3[i].cahier,
                            piece: results3[i].piece,
                            prof_nom: results3[i].prof_nom
                        });
                        piano_trouve = "oui";
                    }
                
                }
                if (piano_trouve === "oui") { await GS_rassemblementidf_PIANO.addRows(ajout_piano);}


                logger.info("AJOUT GOOGLESHEET FIN", { numsession: req.session.id, label: filename});


            } catch (error) {
                // Echec de connection à la GOOGLE SHEET
                logger.error("Il y a un problème avec la connection à Google sheet (TRY 4) : " + error, { numsession: req.session.id, label: filename});
                req.session.err_mail_form_adhesion_1 = '"Il y a un problème système, "' + error;
                res.redirect('/rassemblementidf/identifier');
            }

            //////////////////////////////////////////////////////////////////////////////
            // ENVOIE CONFIRMATION PAR MAIL

            let mail_objet = "ASSOCIATION FRANÇAISE POUR LA PÉDAGOGIE SUZUKI - RASSEMBLEMENT IDF 2026 - ";
            mail_objet += results2[0].adherent_nom;

            let mail_html = "<p style='font-size: 12pt; font-family: Arial; color: #454343; text-decoration: none;'>Cher adhérent,</p><p style='font-size: 12pt; font-family: Arial; color: #454343; text-decoration: none;'>Félicitations ! Vous êtes désormais inscrit au rassemblement Ile de France du 19 avril 2026 organisé par l’association La clef du bonheur, en partenariat avec l'Association Française pour la Pédagogie Suzuki.</p>";

            mail_html += "<p style='font-size: 12pt; font-family: Arial; color: #454343; text-decoration: none;'>L'accueil est ouvert à partir de 9h30. Premier atelier à 10h30, prévoir d'être dans la salle pour l'accord à partir de 10h15. Prévoyez d'arriver en avance pour vous familiariser avec le lieu et l'emploi du temps.<br>Un point café est proposé par les parents d'élèves,  vous y trouverez des boissons,  gâteaux,  viennoiseries ....prévoyez un peu d'argent en liquide pour pouvoir en profiter. <br>La journée se terminera après le concert vers  16h30  et un goûter sera offert aux enfants.</p>";
            mail_html += "<p style='font-size: 12pt; font-family: Arial; color: #454343; text-decoration: none;'>Vous voudrez bien apportez votre pique-nique pour le déjeuner de midi.</p>";

            mail_html += "<p style='font-size: 12pt; font-family: Arial; color: #454343; text-decoration: none;'>Vous trouverez en pièce jointe le programme à réviser.</p>";
            mail_html += "<p style='font-size: 12pt; font-family: Arial; color: #454343; text-decoration: none;'>ACCÈS : parking de la salle des fêtes de Maule, place Henri Dunand, Chaussée Saint Vincent 78580 Maule. Accueil : École René Coty. Des T-shirt orange seront là pour vous diriger et vous accueillir.</p>";

            mail_html += "<br>";

            mail_html += '<p style="color:#E73058;font-size: 13pt; font-family: Arial; text-decoration: none;"><strong>VOTRE FACTURE :</strong></p>';
            mail_html += "<p style='font-size: 12pt; font-family: Arial; color: #454343; text-decoration: none;'><strong>Identifiant Suzuki : </strong>";
            mail_html += req.session.identifiant;
            mail_html += "</p><p style='font-size: 12pt; font-family: Arial; color: #454343; text-decoration: none;'><strong>Association Suzuki : </strong>";
            mail_html += results2[0].association_suzuki;
            mail_html += "</p>";
            if (results2[0].accompagnant_nom !== "undefined") {
                mail_html += "<p style='font-size: 12pt; font-family: Arial; color: #454343; text-decoration: none;'><strong>Personne accompagnante : </strong>";
                mail_html += results2[0].accompagnant_nom;
                mail_html += " ";
                mail_html += results2[0].accompagnant_prenom;;
                mail_html += "</p>";
            }
            if (results2[0].bus_nb > 0) {
                mail_html += "<p style='font-size: 12pt; font-family: Arial; color: #454343; text-decoration: none;'><strong>Nombre de personnes pour la navette depuis Maule : </strong>";
                mail_html += results2[0].bus_nb;
                mail_html += "</p>";
            }
            mail_html += "<br>";
            for (let toto = 0; toto<(results3.length); toto++) {
                if (results3[toto].ras_part_nom) {
                    mail_html += "<p style='font-size: 12pt; font-family: Arial; color: #07475A; text-decoration: underline;'><strong>PARTICIPANT ";
                    mail_html += toto + 1;
                    mail_html += "</strong></p>";
                    mail_html += "<p style='font-size: 12pt; font-family: Arial; color: #454343; text-decoration: none;'><strong style='color:#0D6A87'>Nom : </strong>";
                    mail_html += results3[toto].ras_part_nom;
                    mail_html += " ";
                    mail_html += results3[toto].ras_part_prenom;
                    mail_html += "</p>";
                    mail_html += "<p style='font-size: 12pt; font-family: Arial; color: #454343; text-decoration: none;'><strong style='color:#0D6A87'>Catégorie : </strong>";
                    mail_html += results3[toto].ras_part_role;
                    mail_html += "</p>";
                    if (results3[toto].ras_part_role === "professeur") {
                        mail_html += "<p style='font-size: 12pt; font-family: Arial; color: #454343; text-decoration: none;'><strong style='color:#0D6A87'>Instrument : </strong>";
                        mail_html += results3[toto].instrument;
                        mail_html += "</p>";
                        if (results3[toto].repas_prof === "repas") {
                            mail_html += "<p style='font-size: 12pt; font-family: Arial; color: #454343; text-decoration: none;'><strong style='color:#0D6A87'>Repas : oui (8€)</strong></p>";
                        }
                    }
                    if (results3[toto].ras_part_role === "instrumentiste") {
                        mail_html += "</p><p style='font-size: 12pt; font-family: Arial; color: #454343; text-decoration: none;'><strong style='color:#0D6A87'>Age : </strong>";
                        mail_html += results3[toto].ras_part_age;
                        mail_html += "</p>";
                        mail_html += "<p style='font-size: 12pt; font-family: Arial; color: #454343; text-decoration: none;'><strong style='color:#0D6A87'>Instrument : </strong>";
                        mail_html += results3[toto].instrument;
                        mail_html += " - ";
                        mail_html += results3[toto].cahier;
                        mail_html += " - ";
                        mail_html += results3[toto].piece;
                        mail_html += "</p>";
                        mail_html += "</p><p style='font-size: 12pt; font-family: Arial; color: #454343; text-decoration: none;'><strong style='color:#0D6A87'>Professeur : </strong>";
                        mail_html += results3[toto].prof_nom;
                        mail_html += "</p>";
                    }
                    mail_html += "<br>";
                }
            }

            mail_html += "<br>";
            mail_html += "<p style='font-size: 12pt; font-family: Arial; color: #454343; text-decoration: none;'><strong>Coût total : </strong>";
            mail_html += results2[0].cout_total + "€";
            mail_html += "</p><p style='font-size: 12pt; font-family: Arial; color: #454343; text-decoration: none;'>Frais bancaire : ";
            mail_html += results2[0].frais_bancaire + "€";
            mail_html += "<br>Tarif rassemblement : ";
            mail_html += results2[0].tarif_rassemblement + "€";
            mail_html += "<br>Coût repas professeur(s) : ";
            mail_html += results2[0].cout_repas_prof + "€";
            mail_html += "</p>";
            mail_html += "<p style='font-size: 12pt; font-family: Arial; color: #454343; text-decoration: none;'><br>Nous nous réjouissons de vous accueillir pour cette journée !</p><p style='font-size: 12pt; font-family: Arial; color: #454343; text-decoration: none;'>L’Association La clef du bonheur<br>Marie Vélu et Philippe Arestan<br>Pôle organisation du rassemblement</p>";

            let OUTPUT2 = path.resolve(__dirname, "../pdf/rassemblement/documents/")+"/rassemblementidf_programme.pdf";
            var attachment_name_2 = "rassemblementidf_programme.pdf";

            let mailOptions = {
                from: 'afps.inscription@gmail.com',
                to: req.session.adherent_mail,
                subject: mail_objet,
                html: mail_html,
                attachments: [{
                    filename: attachment_name_2,
                    path: OUTPUT2
                }],
            };
            envoie_mail.envoie_mail(mailOptions);

            //////////////////////////////////////////////////////////////////////////////
            // un tag pour ne pas ajouter plusieurs fois le même participant en cas de rafraîchissement de la page
            //////////////////////////////////////////////////////////////////////////////
            req.session.participant_ajoute = "oui";

            //////////////////////////////////////////////////////////////////////////////
            // AFFICHAGE PAGE PAIEMENT RÉUSSI
            //////////////////////////////////////////////////////////////////////////////
            res.render('rassemblementidf/page_templates/paiement_reussi.ejs');


        } catch (error) {
            // Echec de connection à la BD
            logger.error("Il y a un problème avec la connection à la base de données (TRY 1) : " + error, { numsession: req.session.id, label: filename});
            req.session.err_mail_form_adhesion_1 = '"Il y a un problème système, "' + error;
            res.redirect('/rassemblementidf/identifier');
        }

    }

}

const RI_accompte_annule = async function(req, res) {

    logger.info("======================================");
    logger.info("======== FUNCTION RI_accompte_annule ==========");
    logger.info("======================================");

    // VARIABLES
    let CB_retour;
    let stripe_retour;

    // DATE
    moment().format();
    moment.locale('fr');

    //////////////////////////////////////////////////////////////////////////////
    // RETOUR STRIPE
    let id = req.query.id;
    const session_stripe = await stripe.checkout.sessions.retrieve(id);
    let customer_email = session_stripe.customer_email;
    req.session.adherent_mail = customer_email;
    let payment_status = session_stripe.payment_status;
    let amount_total = session_stripe.amount_total/100;
    let stripe_customer = session_stripe.customer;
    let stripe_payment_intent = session_stripe.payment_intent;
    let payment_method_types = session_stripe.payment_method_types;
    let stripe_status = session_stripe.status;
    let identifiant = session_stripe.metadata.identifiant;
    req.session.identifiant = identifiant;
    CB_retour = payment_status + ", " + stripe_customer + ", " + stripe_payment_intent + ", " + session_stripe.id + ", " + payment_method_types + ", " + stripe_status;
    stripe_retour = session_stripe.id;
    logger.info("customer_email : " + customer_email, { numsession: req.session.id, label: filename});
    logger.info("payment_status : " + payment_status, { numsession: req.session.id, label: filename});

    try {
        //Connexion
        let db_connection_promise = await connect_DB_promise();

        /// Vérifier que le paiement n'existe pas déjà
        /// pour ne pas faire le traitement 2 fois en cas de rafraichissement de la page
        let sql0 = 'select identifiant from ras_adherent where stripe_retour = "' + CB_retour + '"';
        const [results0, fields0] = await db_connection_promise.execute(sql0);
        logger.info("Row ras_adherent stripe_retour : " + results0.length, { numsession: req.session.id, label: filename});

        if (results0.length < 1) {
            //Query MAJ ras_adherent
            let sql = 'UPDATE ';
            sql += 'ras_adherent';
            sql += ' SET ';
        
            sql += 'identifiant = concat(identifiant, ID_adherent), ';
            sql += 'stripe_retour = "' + CB_retour + '", ';
            sql += 'statut_paiement = "non paye", ';
            sql += 'statut_suppression = 1';
            sql += ' WHERE identifiant = "' + identifiant + '" AND statut_suppression = 0 AND lieu = "IDF" AND saison = "'+process.env.SAISON+'"';

            logger.info("sql UPDATE ras_adherent : " + sql, { numsession: req.session.id, label: filename});

            const [results, fields] = await db_connection_promise.execute(sql);
            logger.info("Row stn_adherent UPDATE STRIPE: " + results.changedRows, { numsession: req.session.id, label: filename});

            //Query MAJ stn_participant
            let sql1 = 'UPDATE ';
            sql1 += 'ras_participant';
            sql1 += ' SET ';
            sql1 += 'identifiant = concat(identifiant, ID_participant), ';
            sql1 += 'statut_suppression = 1';
            sql1 += ' WHERE identifiant = "' + identifiant + '" AND statut_suppression = 0 AND lieu = "IDF" AND saison = "'+process.env.SAISON+'"';

            logger.info("sql UPDATE ras_participant : " + sql1, { numsession: req.session.id, label: filename});

            const [results1, fields1] = await db_connection_promise.execute(sql1);
            logger.info("Row ras_participant UPDATE suppression: " + results1.changedRows, { numsession: req.session.id, label: filename});

            await db_connection_promise.end();

            //////////////////////////////////////////////////////////////////////////////
            // AFFICHAGE DE LA PAGE ANNULÉ
            res.locals.identifiant = identifiant;
            res.render('rassemblementidf/page_templates/paiement_annule');
        }
 
    } catch (error) {
        // Echec de connection à la BD
        logger.error("Il y a un problème système : " + error, { numsession: req.session.id });
        req.session.err_mail_form_adhesion_1 = '"Il y a un problème système, "' + error;
        //await db_connection_promise.end();
        res.redirect('/rassemblementidf/identifier');
    }


}

const RI_post_valid_ss_paiement = async function (req, res) {

    logger.info("======================================");
    logger.info("======== FUNCTION RI_post_valid_ss_paiement ==========");
    logger.info("======================================");

    // VARIABLES
    /////////////////////////////////////////////////
    let saison = process.env.SAISON;
    moment.locale('fr');
    let now = moment().format("YYYY-MM-DD HH:mm:ss");
    let sql;
    let table;
    let champs;
    let values;

    /////////////////////////////////////////////////
    // SI IDENTIFIANT PERDU
    /////////////////////////////////////////////////
    logger.info("req.session.identifiant : " + req.session.identifiant , { numsession: req.session.id, label: filename});
    if (req.session.identifiant === undefined) {
        logger.info("IDENTIFIANT PERDU", { numsession: req.session.id });
        req.session.err_mail_form_adhesion_1 = "Session expirée, veuillez recommencer";
        res.redirect('/rassemblementidf/identifier');
    } else {
        /////////////////////////////////////////////////
        // AJOUT DANS LA BASE DE DONNÉES

        // TRY 5
        try {
            //Connexion
            let db_connection_promise = await connect_DB_promise();

            // une vérification pour ne pas ajouter plusieurs fois le même participant en cas de rafraîchissement de la page
            logger.info("req.session.participant_ajoute : " + req.session.participant_ajoute, { numsession: req.session.id, label: filename});
            if (req.session.participant_ajoute === "oui") {
                req.session.err_mail_form_adhesion_1 = "Votre session est terminée, les participants ont déjà été ajoutés.";
                res.redirect('/rassemblementidf/identifier');
            } else {
                /////////////////////////////////////////////////
                // AJOUT PARTICIPANTS
                for (let toto = 1; toto < 7; toto++) {
                    if (req.session["personne_"+toto+"_nom"]) {
                        // QUERY ADD ras_participant
                        table = "ras_participant";
                        if (req.session["personne_"+toto+"_role"] === "professeur"){
                            champs = "lieu, saison, identifiant, date_maj, ras_part_nom, ras_part_prenom, ras_part_date_naiss, ras_part_age, ras_part_role, instrument, repas_prof, statut_suppression";
                            values = '"IDF", "'+process.env.SAISON+'", "'+ req.session.identifiant + '", "'+ now + '", "'+ req.session["personne_"+toto+"_nom"] + '", "' + req.session["personne_"+toto+"_prenom"] + '", "'+ req.session["personne_"+toto+"_datenaissance"] + '", "'+ req.session["personne_"+toto+"_age"] + '", "' + req.session["personne_"+toto+"_role"] + '", "' + req.session["personne_"+toto+"_instrument"] + '", "'+ req.session["personne_"+toto+"_repas"] + '", 0';
                        }
                        sql = 'INSERT INTO ' + table + ' (' + champs + ') VALUES (' + values + ')';
                        logger.info("REQUETE SQL INSERT INTO ras_participant : " + sql , { numsession: req.session.id, label: filename});
                        const [results_ras_participant, fields] = await db_connection_promise.execute(sql);
                        logger.info("ras_participant Row ID added : " + results_ras_participant.insertId, { numsession: req.session.id, label: filename});
                    }
                }

                /////////////////////////////////////////////////
                // AJOUT DB ADHÉRENTS
                // QUERY ADD ras_adherent
                if (!req.session.bus_nb) {req.session.bus_nb = 0};
                table = "ras_adherent";
                champs = "lieu, identifiant, association_suzuki, saison, date_maj, adherent_nom, adherent_prenom, adherent_telephone, adherent_mail, adherent_adresse_rue, adherent_adresse_complement, adherent_adresse_codepostal, adherent_adresse_ville, adherent_adresse_pays, ras_commentaire, accompagnant_nom, accompagnant_prenom, bus_nb, tarif_rassemblement, cout_repas_prof, frais_bancaire, cout_total, statut_paiement, statut_suppression";
                values = '"IDF", "' + req.session.identifiant + '", "' + req.session.association_suzuki + '", "' + saison + '", "' + now + '", "' + req.session.adherent_nom + '", "' + req.session.adherent_prenom + '", "' + req.session.adherent_telephone_mobile + '", "' + req.session.adherent_mail + '", "' + req.session.adherent_adresse_rue + '", "' + req.session.adherent_adresse_complement + '", "' + req.session.adherent_adresse_codepostal + '", "' + req.session.adherent_adresse_ville + '", "' + req.session.adherent_adresse_pays + '", "' + req.session.commentaire_adherent + '", "' + req.session.accompagnant_nom + '", "' + req.session.accompagnant_prenom + '",' + req.session.bus_nb + ',' + req.session.cout_rassemblement + ',' + req.session.cout_repas + ',' + req.session.accompte_frais_bancaire + ',' + req.session.cout_total + ',"gratuit",0';
                sql = 'INSERT INTO ' + table + ' (' + champs + ') VALUES (' + values + ')';

                logger.info("REQUETE SQL INSERT INTO ras_adherent : " + sql , { numsession: req.session.id, label: filename});
                const [results_ras_adherent, fields] = await db_connection_promise.execute(sql);
                logger.info("ras_adherent Row ID added : " + results_ras_adherent.insertId, { numsession: req.session.id, label: filename});

                //////////////////////////////////////////////////////////////////////////////
                // Query Récupération des infos pour copie dans Google Sheet + envoie du mail
                // obligatoire pour récupérer le numéro adhérent
                // adhérent
                let sql2 = 'select * from  ';
                sql2 += 'ras_adherent';
                sql2 += ' WHERE identifiant = "' + req.session.identifiant + '" AND statut_suppression = 0 AND lieu = "IDF" AND saison = "' + process.env.SAISON + '"';
                const [results2, fields2] = await db_connection_promise.execute(sql2);
                logger.info("Row ras_adherent SELECT : " + results2.length, { numsession: req.session.id, label: filename});

                // participants
                let sql3 = 'SELECT ras_adherent.identifiant, ras_adherent.association_suzuki, ras_adherent.saison, ras_adherent.date_maj, ras_adherent.adherent_nom, ras_adherent.adherent_prenom, ras_adherent.adherent_telephone, ras_adherent.adherent_mail, ras_participant.ID_participant, ras_participant.ras_part_nom, ras_participant.ras_part_prenom, ras_participant.ras_part_date_naiss, ras_participant.ras_part_role, ras_participant.ras_part_age, ras_participant.instrument, ras_participant.cahier, ras_participant.piece, ras_participant.prof_nom, ras_participant.repas_prof FROM ras_participant JOIN ras_adherent ON ras_participant.identifiant = ras_adherent.identifiant WHERE ras_participant.identifiant = "' + req.session.identifiant + '" AND ras_participant.statut_suppression = 0 AND ras_participant.lieu = "IDF" AND ras_participant.saison = "' + process.env.SAISON + '"';
                const [results3, fields3] = await db_connection_promise.execute(sql3);
                await db_connection_promise.end();
                logger.info("Row ras_participant SELECT nombre de participants : " + results3.length, { numsession: req.session.id, label: filename});

                await db_connection_promise.end();

                //////////////////////////////////////////////////////////////////////////////
                // PRÉPARATION PAGE PAIEMENT RÉUSSI
                res.locals.identifiant = req.session.identifiant;
                res.locals.association_suzuki = req.session.association_suzuki;
                res.locals.bus_nb = req.session.bus_nb;

                for (let toto = 1; toto <= (results3.length); toto++) {
                    res.locals["personne_"+toto+"_numero"] = toto;
                    res.locals["personne_"+toto+"_nom"] = req.session["personne_"+toto+"_nom"];
                    res.locals["personne_"+toto+"_prenom"] = req.session["personne_"+toto+"_prenom"];
                    res.locals["personne_"+toto+"_role"] = req.session["personne_"+toto+"_role"];
                    res.locals["personne_"+toto+"_instrument"] = req.session["personne_"+toto+"_instrument"];
                    res.locals["personne_"+toto+"_repas"] = req.session["personne_"+toto+"_repas"];
                    logger.info('toto = ' + toto, { numsession: req.session.id, label: filename });
                    logger.info('res.locals["personne_"+toto+"_prenom"] = ' + res.locals["personne_"+toto+"_prenom"], { numsession: req.session.id, label: filename });
                }
                res.locals.tag_ss_paiement = "oui";

                //////////////////////////////////////////////////////////////////////////////
                // AJOUT INFOS DANS GOOGLE SHEET
                // TRY 6
                try {
                    await GS_rassemblementidf.useServiceAccountAuth(GS_creds_rassemblementidf);
                    await GS_rassemblementidf.loadInfo();
                    let GS_rassemblementidf_Adherents = GS_rassemblementidf.sheetsByTitle['Adherents'];
                    let GS_rassemblementidf_Paiements = GS_rassemblementidf.sheetsByTitle['Paiements'];
                    let GS_rassemblementidf_NAVETTE = GS_rassemblementidf.sheetsByTitle['NAVETTE'];
                    let GS_rassemblementidf_Professeurs = GS_rassemblementidf.sheetsByTitle['Professeurs'];

                    await GS_rassemblementidf_Adherents.addRows (
                        [
                            {
                                ID_adherent: results2[0].ID_adherent,
                                saison: results2[0].saison,
                                identifiant: req.session.identifiant,
                                association_suzuki: results2[0].association_suzuki,
                                date: moment(results2[0].date_maj).format("YYYY-MM-DD HH:mm:ss"),
                                adherent_nom: results2[0].adherent_nom.toUpperCase(),
                                adherent_prenom: results2[0].adherent_prenom,
                                adherent_mail: results2[0].adherent_mail,
                                adherent_telephone: "'" + results2[0].adherent_telephone,
                                adherent_adresse_rue: results2[0].adherent_adresse_rue,
                                adherent_adresse_complement: results2[0].adherent_adresse_complement,
                                adherent_adresse_codepostal: results2[0].adherent_adresse_codepostal,
                                adherent_adresse_ville: results2[0].adherent_adresse_ville,
                                adherent_adresse_pays: results2[0].adherent_adresse_pays,
                                commentaire: results2[0].ras_commentaire
                            }
                        ]
                    );
    
                    if (results2[0].bus_nb > 0) {
                        await GS_rassemblementidf_NAVETTE.addRows (
                            [
                                {
                                    ID_adherent: results2[0].ID_adherent,
                                    identifiant: req.session.identifiant,
                                    adherent_nom: results2[0].adherent_nom.toUpperCase(),
                                    adherent_prenom: results2[0].adherent_prenom,
                                    adherent_telephone: "'" + results2[0].adherent_telephone,
                                    bus_nb : results2[0].bus_nb
                                }
                            ]
                        );
                    }

                    let ajout_professeur = [];
                    let professeur_trouve = "";
                    for (let i = 0; i < results3.length; i++) {
                        if (results3[i].ras_part_role === "professeur") {
                            ajout_professeur.push({
                                ID_participant: results3[i].ID_participant,
                                identifiant: req.session.identifiant,
                                participant_nom: results3[i].ras_part_nom.toUpperCase(),
                                participant_prenom: results3[i].ras_part_prenom,
                                participant_age: results3[i].ras_part_age,
                                adherent_mail: results3[i].adherent_mail,
                                adherent_telephone: "'" + results3[i].adherent_telephone,
                                instrument: results3[i].instrument,
                                repas: results3[i].repas_prof
                            });
                            professeur_trouve = "oui";
                        }
                    }
                    if (professeur_trouve === "oui") { await GS_rassemblementidf_Professeurs.addRows(ajout_professeur);}

                    logger.info("AJOUT GOOGLESHEET FIN", { numsession: req.session.id, label: filename});
    

                } catch (error) {
                    // Echec de connection à la GOOGLE SHEET
                    logger.error("Il y a un problème avec la connection à Google sheet (TRY 6) : " + error, { numsession: req.session.id, label: filename});
                    req.session.err_mail_form_adhesion_1 = '"Il y a un problème système, "' + error;
                    res.redirect('/rassemblementidf/identifier');
                }

                //////////////////////////////////////////////////////////////////////////////
                // ENVOIE CONFIRMATION PAR MAIL

                let mail_objet = "ASSOCIATION FRANÇAISE POUR LA PÉDAGOGIE SUZUKI - RASSEMBLEMENT IDF 2026 - ";
                mail_objet += results2[0].adherent_nom;

                let mail_html = "<p style='font-size: 12pt; font-family: Arial; color: #454343; text-decoration: none;'>Cher adhérent,</p><p style='font-size: 12pt; font-family: Arial; color: #454343; text-decoration: none;'>Félicitations ! Vous êtes désormais inscrit au rassemblement Ile de France du 19 avril 2026 organisé par l’association La clef du bonheur, en partenariat avec l'Association Française pour la Pédagogie Suzuki.</p>";

                mail_html += "<p style='font-size: 12pt; font-family: Arial; color: #454343; text-decoration: none;'>L'accueil est ouvert à partir de 9h30. Premier atelier à 10h30, prévoir d'être dans la salle pour l'accord à partir de 10h15. Prévoyez d'arriver en avance pour vous familiariser avec le lieu et l'emploi du temps.<br>Un point café est proposé par les parents d'élèves,  vous y trouverez des boissons,  gâteaux,  viennoiseries ....prévoyez un peu d'argent en liquide pour pouvoir en profiter. <br>La journée se terminera après le concert vers  16h30  et un goûter sera offert aux enfants.</p>";
                mail_html += "<p style='font-size: 12pt; font-family: Arial; color: #454343; text-decoration: none;'>Vous voudrez bien apportez votre pique-nique pour le déjeuner de midi.</p>";

                mail_html += "<p style='font-size: 12pt; font-family: Arial; color: #454343; text-decoration: none;'>Vous trouverez en pièce jointe le programme à réviser.</p>";
                mail_html += "<p style='font-size: 12pt; font-family: Arial; color: #454343; text-decoration: none;'>ACCÈS : parking de la salle des fêtes de Maule, place Henri Dunand, Chaussée Saint Vincent 78580 Maule. Accueil : École René Coty. Des T-shirt orange seront là pour vous diriger et vous accueillir.</p>";
    
                mail_html += "<br>";

                mail_html += '<p style="color:#E73058;font-size: 13pt; font-family: Arial; text-decoration: none;"><strong>VOTRE INSCRIPTION :</strong></p>';
                mail_html += "<p style='font-size: 12pt; font-family: Arial; color: #454343; text-decoration: none;'><strong>Identifiant Suzuki : </strong>";
                mail_html += req.session.identifiant;
                mail_html += "</p><p style='font-size: 12pt; font-family: Arial; color: #454343; text-decoration: none;'><strong>Association Suzuki : </strong>";
                mail_html += results2[0].association_suzuki;
                mail_html += "</p>";
                if (results2[0].bus_nb > 0) {
                    mail_html += "<p style='font-size: 12pt; font-family: Arial; color: #454343; text-decoration: none;'><strong>Nombre de personnes pour la navette depuis Maule : </strong>";
                    mail_html += results2[0].bus_nb;
                    mail_html += "</p>";
                }
                mail_html += "<br>";
                for (let toto = 0; toto<(results3.length); toto++) {
                    if (results3[toto].ras_part_nom) {
                        mail_html += "<p style='font-size: 12pt; font-family: Arial; color: #07475A; text-decoration: underline;'><strong>PARTICIPANT ";
                        mail_html += toto + 1;
                        mail_html += "</strong></p>";
                        mail_html += "<p style='font-size: 12pt; font-family: Arial; color: #454343; text-decoration: none;'><strong style='color:#0D6A87'>Nom : </strong>";
                        mail_html += results3[toto].ras_part_nom;
                        mail_html += " ";
                        mail_html += results3[toto].ras_part_prenom;
                        mail_html += "</p>";
                        mail_html += "<p style='font-size: 12pt; font-family: Arial; color: #454343; text-decoration: none;'><strong style='color:#0D6A87'>Catégorie : </strong>";
                        mail_html += results3[toto].ras_part_role;
                        mail_html += "</p>";
                        if (results3[toto].ras_part_role === "professeur") {
                            mail_html += "<p style='font-size: 12pt; font-family: Arial; color: #454343; text-decoration: none;'><strong style='color:#0D6A87'>Instrument : </strong>";
                            mail_html += results3[toto].instrument;
                            mail_html += "</p>";
                        }
                        mail_html += "<br>";
                    }
                }

                mail_html += "<br>";
                
                mail_html += "<p style='font-size: 12pt; font-family: Arial; color: #454343; text-decoration: none;'><br>Nous nous réjouissons de vous accueillir pour cette journée !</p><p style='font-size: 12pt; font-family: Arial; color: #454343; text-decoration: none;'>L’Association La clef du bonheur<br>Marie Vélu et Philippe Arestan<br>Pôle organisation du rassemblement</p>";
                
                let OUTPUT = path.resolve(__dirname, "../pdf/rassemblement/documents/")+"/rassemblementidf_plan_lieu.pdf";
                var attachment_name = "rassemblementidf_plan_lieu.pdf";

                let OUTPUT2 = path.resolve(__dirname, "../pdf/rassemblement/documents/")+"/rassemblementidf_programme.pdf";
                var attachment_name_2 = "rassemblementidf_programme.pdf";

                let mailOptions = {
                    from: 'afps.inscription@gmail.com',
                    to: req.session.adherent_mail,
                    subject: mail_objet,
                    html: mail_html,
                    attachments: [{
                        filename: attachment_name_2,
                        path: OUTPUT2
                    }],
                };
                envoie_mail.envoie_mail(mailOptions);

                //////////////////////////////////////////////////////////////////////////////
                // un tag pour ne pas ajouter plusieurs fois le même participant en cas de rafraîchissement de la page
                //////////////////////////////////////////////////////////////////////////////
                req.session.participant_ajoute = "oui";

                //////////////////////////////////////////////////////////////////////////////
                // AFFICHAGE PAGE PAIEMENT RÉUSSI
                //////////////////////////////////////////////////////////////////////////////


                res.render('rassemblementidf/page_templates/paiement_reussi.ejs');




            }




        } catch (error) {
            // Echec de connection à la BD
            logger.error("Il y a un problème avec la connection à la base de données (TRY 5) : " + error, { numsession: req.session.id });
            req.session.err_mail_form_adhesion_1 = '"Il y a un problème système connexion base de données, veuillez recommencer, "' + error;
            res.redirect('/rassemblementidf/identifier');
        }

    }


}

/////////////////////////////////////////////////
// EXPORT DE MODULE POUR QU'IL SOIT LU DANS LES AUTRES FICHIERS JS
/////////////////////////////////////////////////

module.exports = {
    RI_checkidentifiant,
    RI_checkinfos,
    post_recap_modifier,
    post_payer_ri,
    RI_accompte_reussi,
    RI_accompte_annule,
    RI_post_valid_ss_paiement
}