/////////////////////////////////////////////////
// LOGGING
/////////////////////////////////////////////////
const logger = require("../public/js/app/logger");

/////////////////////////////////////////////////
// APPELS DES MODULES
/////////////////////////////////////////////////

const moment = require('moment');
const ejs = require('ejs');
var nodemailer = require('nodemailer');
const path = require("path");
const stripe = require('stripe')(process.env.STRIPE_RI_PRIVATE_KEY);
var pdf = require("pdf-creator-node");
var fs = require("fs");

////////////////////////////////////////////////////
// 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');


/////////////////////////////////////////////////
// VARIABLES GLOBALES
/////////////////////////////////////////////////


/////////////////////////////////////////////////
// PAGE 1
// DOAMIN/stagenational/identifier
//
// RECHERCHE SI PERSONNE DÉJA INSCRITE
// SI NON INSCRITE
// RECHERCHE SI ADHÉRENTE DANS BD AFPS
//
/////////////////////////////////////////////////

const RI_checkidentifiant = async function(req, res) {

    /////////////////////////////////////////////////
    // RECHERCHE SI PERSONNE DÉJA INSCRITE
    // DANS BD DU STAGE ANNUEL
    logger.info("======================================", { label: filename });
    logger.info("======== FUNCTION RI_checkidentifiant ==========", { label: filename });
    logger.info("======================================", { label: filename });

    await GS_rassemblementidf.useServiceAccountAuth(GS_creds_rassemblementidf);
    await GS_rassemblementidf.loadInfo(); // loads document properties and worksheets
    logger.info("NOM FICHIER SHEET: " + GS_rassemblementidf.title, { numsession: req.session.id, label: filename });
    const GS_RI_sheet = GS_rassemblementidf.sheetsByTitle['inscription_web'];
    logger.info("NOM DU TABLEAU (ONGLET): "+GS_RI_sheet.title, { label: filename }); //NOM DU TABLEAU (ONGLET)

    const GS_SN_rows = await GS_RI_sheet.getRows();

    // mettre les identifiants dans un array
    let lesidentifiants = new Array;
    let compteur = GS_RI_sheet.rowCount - 1;
    console.log("compteur: ",compteur);

    for (let i=0; i<compteur; i++) {
        lesidentifiants[i] = GS_SN_rows[i].identifiant;
    }

    // afficher le array
    
    logger.info("VOICI LA LISTE DES IDENTIFIANTS", { label: filename });
    
    logger.info(lesidentifiants);

    // recherche l'identifiant saisi dans le array de tous les identifiants de la Google Sheet
    // ON RÉCUPÈRE L'IDENTIFIANT SAISIE DANS LE FORMULAIRE

    // EST-CE QUE L'IDENTIFIANT EST SAISI ?
    logger.info("identifiant saisi : "+req.body.identifiant, { numsession: req.session.id, label: filename});
    if (req.body.identifiant) {

        // IDENTIFIANT SAISI
        req.session.identifiant = req.body.identifiant;
        logger.info("req.body.identifiant : " + req.body.identifiant, { numsession: req.session.id, label: filename});
        logger.info("req.session.identifiant : " + req.session.identifiant, { numsession: req.session.id, label: filename});

        // EST-CE QUE L'IDENTIFIANT SAISI EST DÉJA INSCRIT AU STAGE
        if (lesidentifiants.includes(req.body.identifiant) === true) {
            // DÉJA INSCRIT AU STAGE
            req.session.err_mail_form_adhesion_1 = "Cette identifiant est déjà inscrit pour le Rassemblement IDF 2023.";
            req.session.err_mail_form_adhesion_2 = "Pour tout problème veuillez contacter l’Association.";
            req.session.err_mail_form_adhesion_3 = "";
            res.redirect('/rassemblementidf/identifier');
        } else {
            // NON ENCORE INSCRIT AU STAGE
            
            // COCHÉ AUTRE PAYS
            logger.info("Etat case à coché autre pays : " + req.body.check_autrepays, { numsession: req.session.id, label: filename});
            if (req.body.check_autrepays){
                req.session.err_mail_form_adhesion_1 = "Vous n'êtes pas encore inscrit au stage";
                req.session.err_mail_form_adhesion_2 = "Vous ètes membre Suzuki d'un autre pays";
                req.session.err_mail_form_adhesion_3 = "Nous allons vous diriger vers le formulaire d'inscription";
                res.redirect('/rassemblementidf/formulaire');
            }

            // COCHÉ AUTRE NON ADHÉRENT
            logger.info("Etat case à coché non adhérent : " + req.body.check_nonadherent, { numsession: req.session.id, label: filename});
            if (req.body.check_nonadherent){
                req.session.err_mail_form_adhesion_1 = "Etre adhérent (et posséder un identifiant) à une association de la pédagogie Suzuki est obligatoire pour toute famille ou personne qui souhaite participer au Rassemblement IDF 2023";
                req.session.err_mail_form_adhesion_2 = 'Pour adhérer à l\'association Française pour la Pédagogie Suzuki <a target="_blank" href="https://www.adhesion.afpedagogiesuzuki.fr/inscription/adhesion"><span class="souligne">Cliquez ici</span></a>';
                req.session.err_mail_form_adhesion_3 = 'Vous pouvez également adhérer à l\'association de votre pays. <a target="_blank" href="https://www.europeansuzuki.org/countries/"><span class="souligne">Vous trouverez ici les pays européens</span></a>';
                res.redirect('/rassemblementidf/identifier');
            }

            // SI RIEN COCHÉ
            if (typeof req.body.check_autrepays === 'undefined' && typeof req.body.check_nonadherent === 'undefined') {

                // ON VA VOIR S'IL EST DANS LA BD DES ADHÉRENTS

                // BASE DE DONNÉES DES ADHÉRENTS
                // 2 SHEETS

                const GS_creds_adhe = require('../testapi336520-3105cc3caa46.json');
                const GS_adhe = new GoogleSpreadsheet('1BhpYj-KtsyC8inXIDVl-zldDYRuhEqPwBFvP45FtJkI');
                await GS_adhe.useServiceAccountAuth(GS_creds_adhe);
                await GS_adhe.loadInfo(); // loads document properties and worksheets
                console.log("NOM FICHIER SHEET: ",GS_adhe.title); //nom du fichier
                const GS_adh_sheet = GS_adhe.sheetsByTitle['adhesion_annuelle_web'];
                const GS_adh_sheet_asslocales = GS_adhe.sheetsByTitle['adhesion_ass_locales'];
                const GS_adh_rows = await GS_adh_sheet.getRows();
                const GS_adh_rows_asslocales = await GS_adh_sheet_asslocales.getRows();

                let lesidentifiants_adh = new Array;
                let compteur_adh = GS_adh_sheet.rowCount - 1;
                let compteur_adh_asslocales = GS_adh_sheet_asslocales.rowCount - 1;

                // RÉCUPÉRER LES IDENTIFIANTS DU TABLEAU adhesion_annuelle_web
                for (let i=0; i<compteur_adh; i++) {
                    lesidentifiants_adh.push({identifiant : GS_adh_rows[i].identifiant, association : "AFPS", Adhesion_paye : GS_adh_rows[i].Adhesion_paye});
                }
                // RÉCUPÉRER LES IDENTIFIANTS DU TABLEAU adhesion_ass_locales
                for (let i=0; i<compteur_adh_asslocales; i++) {
                    lesidentifiants_adh.push({identifiant : GS_adh_rows_asslocales[i].identifiant, association : GS_adh_rows_asslocales[i].association, Adhesion_paye : GS_adh_rows_asslocales[i].Adhesion_paye });
                }
                console.log("ARRAY lesidentifiants_adh :");
                console.info(lesidentifiants_adh);

                // RECHERCHE DE L'IDENTIFIANT SAISI DANS LE ARRAY
                const adherent_resultat = lesidentifiants_adh.find( adherent => adherent.identifiant === req.session.identifiant);
                
                if (adherent_resultat){
                    logger.info("Identifiant trouvé dans la base des adhésions : " + adherent_resultat.identifiant, { numsession: req.session.id, label: filename});
                    logger.info("Adhésion payé : " + adherent_resultat.Adhesion_paye, { numsession: req.session.id, label: filename});
                    if (adherent_resultat.Adhesion_paye === "paye" || adherent_resultat.Adhesion_paye === "attente"){
                        logger.info("Identifiant trouvé et payé dans la base des adhésions", { numsession: req.session.id, label: filename});
                        req.session.err_mail_form_adhesion_1 = "Cet identifiant est bien inscrit dans les adhésions 2023/2024.";
                        req.session.err_mail_form_adhesion_2 = "Nous pouvons donc procéder à l'inscription au Rassemblement IDF 2024.";
                        req.session.err_mail_form_adhesion_3 = "Vous allez être redirigé vers le formulaire.";
    
                        req.session.association = adherent_resultat.association;
                        
                        console.log("NOM FICHIER SHEET: ",adherent_resultat);
                        console.log("adherent_resultat association : ",adherent_resultat.association);
                        console.log("adherent_resultat identifiant : ",adherent_resultat.identifiant);
    
                        res.redirect('/rassemblementidf/formulaire');
                    } else {
                        logger.info("Identifiant trouvé mais NON payé dans la base des adhésions", { numsession: req.session.id, label: filename });
                        req.session.err_mail_form_adhesion_1 = "Cet identifiant n'a pas payé l'adhésion 2023/2024.";
                        req.session.err_mail_form_adhesion_2 = "Vous devez adhérer avant de vous inscrire au Rassemblement IDF 2024";
                        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.adhesion.afpedagogiesuzuki.fr/inscription/adhesion"><span class="souligne">Cliquez ici</span></a>';
                        res.redirect('/rassemblementidf/identifier');
                        
                    }
                } else {
                    logger.info("Identifiant NON trouvé dans la base des adhésions", { numsession: req.session.id, label: filename });
                    req.session.err_mail_form_adhesion_1 = "Cet identifiant N'EST PAS inscrit dans les adhésions 2023/2024.";
                    req.session.err_mail_form_adhesion_2 = "Vous devez adhérer avant de vous inscrire au Rassemblement IDF 2024";
                    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.adhesion.afpedagogiesuzuki.fr/inscription/adhesion"><span class="souligne">Cliquez ici</span></a>';
                    res.redirect('/rassemblementidf/identifier');
                    
                }
            }
            
        }
    } else {
        // IDENTIFIANT NON SAISI
        req.session.err_mail_form_adhesion_1 = "Etre adhérent (et posséder un identifiant) à une association de la pédagogie Suzuki est obligatoire pour toute famille ou personne qui souhaite participer au Rassemblement IDF 2023";
        req.session.err_mail_form_adhesion_2 = 'Pour adhérer à l\'association Française pour la Pédagogie Suzuki <a target="_blank" href="https://www.adhesion.afpedagogiesuzuki.fr/inscription/adhesion"><span class="souligne">Cliquez ici</span></a>';
        req.session.err_mail_form_adhesion_3 = 'Vous pouvez également adhérer à l\'association de votre pays. <a target="_blank" href="https://www.europeansuzuki.org/countries/"><span class="souligne">Vous trouverez ici les pays européens</span></a>';
        res.redirect('/rassemblementidf/identifier');
    }

}


/////////////////////////////////////////////////
// PAGE 2
// DOMAIN/stagenational/formulaire
//
// RECUPERATION CHAMPS SAISIS
// CALCUL AGE
// CALCUL DU PRIX
// AFFICHER PAGE RECAP
//
/////////////////////////////////////////////////

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
    req.session.association = req.body.association;
    logger.info("req.session.association : " + req.session.association, { numsession: req.session.id, label: filename });
    req.session.adherent_nom = req.body.adherent_nom;
    logger.info("req.session.adherent_nom : " + req.session.adherent_nom, { numsession: req.session.id, label: filename });
    req.session.adherent_prenom = req.body.adherent_prenom;
    req.session.adherent_adresse_rue = req.body.adherent_adresse_rue;
    req.session.adherent_adresse_complement = req.body.adherent_adresse_complement;
    req.session.adherent_adresse_codepostal = req.body.adherent_adresse_codepostal;
    req.session.adherent_adresse_ville = req.body.adherent_adresse_ville;
    req.session.adherent_adresse_pays = req.body.adherent_adresse_pays;
    req.session.adherent_telephone_mobile = req.body.adherent_telephone_mobile;
    req.session.adherent_telephone_fixe = req.body.adherent_telephone_fixe;
    req.session.adherent_mail = req.body.adherent_mail;
    req.session.bus_nb = req.body.bus_nb;
    req.session.accompagnant_nom = req.body.accompagnant_nom;
    logger.info("req.session.accompagnant_nom : " + req.session.accompagnant_nom, { numsession: req.session.id, label: filename });
    req.session.accompagnant_prenom = req.body.accompagnant_prenom;
    logger.info("req.session.accompagnant_prenom : " + req.session.accompagnant_prenom, { numsession: req.session.id, label: filename });
    req.session.commentaire_adherent = req.body.commentaire_adherent;

    //// INITIALISATION DES MONTANTS PAR FAMILLE
    req.session.cout_rassemblement = 0;
    req.session.accompte_frais_bancaire = 0;
    req.session.cout_total = 0;
    logger.info("req.session.cout_rassemblement = " + req.session.cout_rassemblement, { 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 });

    var nbr_eleve = 0;

    for (let toto = 1; toto < 7; toto++) {
        req.session["personne_"+toto+"_nom"] = req.body["personne_"+toto+"_nom"];
        logger.info('req.session["personne_"'+toto+'"_nom"] = ' + req.session["personne_"+toto+"_nom"], { numsession: req.session.id, label: filename });
        req.session["personne_"+toto+"_prenom"] = req.body["personne_"+toto+"_prenom"];
        logger.info('req.session["personne_"'+toto+'"_prenom"] = ' + req.session["personne_"+toto+"_prenom"], { numsession: req.session.id, label: filename });
        req.session["personne_"+toto+"_datenaissance"] = req.body["personne_"+toto+"_datenaissance"];
        logger.info('req.session["personne_"'+toto+'"_datenaissance"] = ' + req.session["personne_"+toto+"_datenaissance"], { numsession: req.session.id, label: filename });

        req.session["personne_"+toto+"_instrument"] = req.body["personne_"+toto+"_instrument"];
        logger.info('req.session["personne_"'+toto+'"_instrument"] = ' + req.session["personne_"+toto+"_instrument"], { numsession: req.session.id, label: filename });
        req.session["personne_"+toto+"_cahier"] = req.body["personne_"+toto+"_cahier"];
        logger.info('req.session["personne_"'+toto+'"_cahier"] = ' + req.session["personne_"+toto+"_cahier"], { numsession: req.session.id, label: filename });
        req.session["personne_"+toto+"_piece"] = req.body["personne_"+toto+"_piece"];
        logger.info('req.session["personne_"'+toto+'"_piece"] = ' + req.session["personne_"+toto+"_piece"], { numsession: req.session.id, label: filename });
        req.session["personne_"+toto+"_prof"] = req.body["personne_"+toto+"_prof"];
        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"]) {
            logger.info('req.session["personne_"'+toto+'"_datenaissance"] : ' + req.session["personne_"+toto+"_datenaissance"], { numsession: req.session.id, label: filename });
            let datenaissance_concat = req.session["personne_"+toto+"_datenaissance"];
            logger.info("datenaissance_concat : " + datenaissance_concat, { numsession: req.session.id, label: filename });

            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('2023-05-07');
            logger.info("birthDate : " + birthDate, { numsession: req.session.id, label: filename });
            logger.info("debutrassemblement : " + debutrassemblement, { numsession: req.session.id, label: filename });

            var age = debutrassemblement.getFullYear() - birthDate.getFullYear();
            logger.info("age : " + age, { numsession: req.session.id, label: filename });
            var m = debutrassemblement.getMonth() - birthDate.getMonth();
            if (m < 0 || (m === 0 && debutrassemblement.getDate() < birthDate.getDate())) {
            logger.info("debutrassemblement.getDate() = " + debutrassemblement.getDate(), { numsession: req.session.id, label: filename });
            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
            nbr_eleve++;
            logger.info('nbr_eleve dans boucle date de naissance : ' + nbr_eleve, { numsession: req.session.id, label: filename });

        }
    }
    
    ///// 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.accompte_frais_bancaire = 1;
        req.session.cout_total += req.session.cout_rassemblement + req.session.accompte_frais_bancaire;
    };
    if (nbr_eleve > 1){
        req.session.cout_rassemblement = 51;
        req.session.accompte_frais_bancaire = 1;
        req.session.cout_total += req.session.cout_rassemblement + req.session.accompte_frais_bancaire;
    }
    if (nbr_eleve < 1){
        req.session.err_nbr_eleve = "Vous n'avez pas inscrit d'élève";
        logger.info('req.session.err_nbr_eleve : ' + req.session.err_nbr_eleve, { numsession: req.session.id, label: filename });
    }

    if (req.session.err_nbr_eleve) {
        logger.info("existing session_err_nbr_eleve : " + req.session.err_nbr_eleve, { numsession: req.session.id });
        res.redirect('/rassemblementidf/formulaire');
    } else {
        logger.info('req.session.cout_rassemblement : ' + req.session.cout_rassemblement, { 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');
    }

    

}

/////////////////////////////////////////////////
// PAGE 3
// DOMAIN/stagenational/recap
//
// Bouton modifier
//
/////////////////////////////////////////////////

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



/////////////////////////////////////////////////
// PAYER ACCOMPTE
//
// Enregistrement des infos dans la Google Sheet avant le paiement
// (car le redirect après le paiement vers la page "réussi" ou "annulé" initialise une autre session qui fait perdre le cookie précédent et les infos saisies)
// Payer accompte par carte bancaire
// STIPE
//
/////////////////////////////////////////////////

// CLICK SUR BOUTON PAYER ACCOMPTE PAGE RECAP
const post_payer_ri = async function(req, res, next) {

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


    //////////////////////////////////
    // AJOUT INFO DANS LA GOOGLE SHEET


    await GS_rassemblementidf.useServiceAccountAuth(GS_creds_rassemblementidf);
    await GS_rassemblementidf.loadInfo(); // loads document properties and worksheets
    logger.info("NOM FICHIER SHEET : " + GS_rassemblementidf.title, { numsession: req.session.id, label: filename });
    const GS_RI_sheet = GS_rassemblementidf.sheetsByTitle['inscription_web'];
    logger.info("NOM DU TABLEAU (ONGLET): " + GS_RI_sheet.title, { numsession: req.session.id, label: filename });

    // DATE DE L'INSCRIPTION
    moment().format();
    moment.locale('fr');
    var date_formattee = moment().format('L')
    console.log("date_formattee:", date_formattee);

    // AJOUTER UNE LIGNE DANS LA GOOGLE SHEET
    logger.info("/ AJOUTER UNE LIGNE DANS LA GOOGLE SHEET", { numsession: req.session.id, label: filename });
    logger.info("req.session.identifiant : " + req.session.identifiant, { numsession: req.session.id, label: filename });
    logger.info("req.session.adherent_nom : " + req.session.adherent_nom, { numsession: req.session.id, label: filename });
    const moreRows = await GS_RI_sheet.addRows([
        {
            'saison': "2022/2023",
            'identifiant': req.session.identifiant,
            'association_suzuki': req.session.association,
            'status_inscription': "clic_bouton_payer",
            'inscription_date': date_formattee,
            'adherent_nom': req.session.adherent_nom,
            'adherent_prenom': req.session.adherent_prenom,
            'cout_total': req.session.cout_total,
            'cout_rassemblement': req.session.cout_rassemblement,
            'frais_bancaire': req.session.accompte_frais_bancaire,
            'adherent_adresse_rue': req.session.adherent_adresse_rue,
            'adherent_adresse_complement': req.session.adherent_adresse_complement,
            'adherent_adresse_codepostal': req.session.adherent_adresse_codepostal,
            'adherent_adresse_ville': req.session.adherent_adresse_ville,
            'adherent_adresse_pays': req.session.adherent_adresse_pays,
            'adherent_telephone_fixe': req.session.adherent_telephone_fixe,
            'adherent_telephone_mobile': req.session.adherent_telephone_mobile,
            'adherent_mail': req.session.adherent_mail,
            'bus_nb': req.session.bus_nb,
            'accompagnant_nom': req.session.accompagnant_nom,
            'accompagnant_prenom': req.session.accompagnant_prenom,
            'commentaire_adherent': req.session.commentaire_adherent,

            'personne_1_nom': req.session.personne_1_nom,
            'personne_1_prenom': req.session.personne_1_prenom,
            'personne_1_datenaissance': req.session.personne_1_datenaissance,
            'personne_1_age': req.session.personne_1_age,
            'personne_1_instrument': req.session.personne_1_instrument,
            'personne_1_cahier': req.session.personne_1_cahier,
            'personne_1_piece': req.session.personne_1_piece,
            'personne_1_prof': req.session.personne_1_prof,

            'personne_2_nom': req.session.personne_2_nom,
            'personne_2_prenom': req.session.personne_2_prenom,
            'personne_2_datenaissance': req.session.personne_2_datenaissance,
            'personne_2_age': req.session.personne_2_age,
            'personne_2_instrument': req.session.personne_2_instrument,
            'personne_2_cahier': req.session.personne_2_cahier,
            'personne_2_piece': req.session.personne_2_piece,
            'personne_2_prof': req.session.personne_2_prof,

            'personne_3_nom': req.session.personne_3_nom,
            'personne_3_prenom': req.session.personne_3_prenom,
            'personne_3_datenaissance': req.session.personne_3_datenaissance,
            'personne_3_age': req.session.personne_3_age,
            'personne_3_instrument': req.session.personne_3_instrument,
            'personne_3_cahier': req.session.personne_3_cahier,
            'personne_3_piece': req.session.personne_3_piece,
            'personne_3_prof': req.session.personne_3_prof,

            'personne_4_nom': req.session.personne_4_nom,
            'personne_4_prenom': req.session.personne_4_prenom,
            'personne_4_datenaissance': req.session.personne_4_datenaissance,
            'personne_4_age': req.session.personne_4_age,
            'personne_4_instrument': req.session.personne_4_instrument,
            'personne_4_cahier': req.session.personne_4_cahier,
            'personne_4_piece': req.session.personne_4_piece,
            'personne_4_prof': req.session.personne_4_prof,

            'personne_5_nom': req.session.personne_5_nom,
            'personne_5_prenom': req.session.personne_5_prenom,
            'personne_5_datenaissance': req.session.personne_5_datenaissance,
            'personne_5_age': req.session.personne_5_age,
            'personne_5_instrument': req.session.personne_5_instrument,
            'personne_5_cahier': req.session.personne_5_cahier,
            'personne_5_piece': req.session.personne_5_piece,
            'personne_5_prof': req.session.personne_5_prof,

            'personne_6_nom': req.session.personne_6_nom,
            'personne_6_prenom': req.session.personne_6_prenom,
            'personne_6_datenaissance': req.session.personne_6_datenaissance,
            'personne_6_age': req.session.personne_6_age,
            'personne_6_instrument': req.session.personne_6_instrument,
            'personne_6_cahier': req.session.personne_6_cahier,
            'personne_6_piece': req.session.personne_6_piece,
            'personne_6_prof': req.session.personne_6_prof,
            
            
        },
    ]);


    //////////////////////////////////
    // PAIEMENT STRIPE


    // STRIPE - ETAPE 1 - CREER l'INTENTION DE PAIEMENT
    logger.info("// STRIPE - ETAPE 1 - CREER l'INTENTION DE PAIEMENT", { numsession: req.session.id, label: filename });
    logger.info("stripe.VERSION = " + stripe.VERSION, { numsession: req.session.id, label: filename });
    logger.info("stripe._api = " + stripe._api, { numsession: req.session.id, label: filename });
    //console.log(stripe);
    logger.info("req.session.adherent_mail = " + req.session.adherent_mail, { numsession: req.session.id, label: filename });
    logger.info("// STRIPE - AJOUT METADATA", { numsession: req.session.id, label: filename });
    logger.info("req.session.identifiant = " + req.session.identifiant, { numsession: req.session.id, label: filename });
    logger.info("req.session.cout_rassemblement = " + req.session.cout_rassemblement, { 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("STRIPE_RI_SUCCESSURL = " + process.env.STRIPE_RI_SUCCESSURL, { numsession: req.session.id, label: filename });
    logger.info("STRIPE_RI_CANCELURL = " + process.env.STRIPE_RI_CANCELURL, { numsession: req.session.id, label: filename });
    logger.info("req.session.cout_total = " + req.session.cout_total, { numsession: req.session.id, 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,
        //There are four different submit types.
        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'
  
    });

    logger.info("session: " + session, { numsession: req.session.id, label: filename });
    logger.info("session.id: " + session.id, { numsession: req.session.id, label: filename });
    logger.info("session.url: " + session.url, { numsession: req.session.id, label: filename });
    let url_stripe = session.url
    res.redirect(session.url)
    
}


/////////////////////////////////////////////////
// RETOUR PAIEMENT REUSSI
const RI_accompte_reussi = async function(req, res){

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

    // RETOUR STRIPE
    var id = req.query.id;

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

    const session_stripe = await stripe.checkout.sessions.retrieve(id);

    var customer_email = session_stripe.customer_email;
    var payment_status = session_stripe.payment_status;
    var amount_total = session_stripe.amount_total/100;
    var stripe_customer = session_stripe.customer;
    var stripe_payment_intent = session_stripe.payment_intent;
    var payment_method_types = session_stripe.payment_method_types;
    var stripe_status = session_stripe.status;
    var identifiant = session_stripe.metadata.identifiant;
    var cout_rassemblement = session_stripe.metadata.cout_rassemblement;
    var accompte_frais_bancaire = session_stripe.metadata.accompte_frais_bancaire;
    var CB_retour = "identifiant_adherent:"+identifiant+",payment_status:"+payment_status+",stripe_customer:"+stripe_customer+",stripe_payment_intent:"+stripe_payment_intent+",sessionID:"+session_stripe.id+",payment_method_types:"+payment_method_types+",amount_total:"+amount_total+",stripe_status:"+stripe_status;
    
    
    console.log("customer_email: ", customer_email);
    logger.info("payment_status : " + payment_status, { numsession: req.session.id, label: filename });
    logger.info("cout_rassemblement : " + cout_rassemblement, { numsession: req.session.id, label: filename });
    logger.info("accompte_frais_bancaire : " + accompte_frais_bancaire, { numsession: req.session.id, label: filename });
    console.log("stripe_customer: ", stripe_customer);
    console.log("amount_total: ", amount_total);
    console.log("stripe_payment_intent: ", stripe_payment_intent);
    console.log("payment_method_types: ", payment_method_types);
    console.log("payment_method_types: ", payment_method_types[0]);
    console.log("stripe_status: ", stripe_status);
    console.log("CB_retour: ", CB_retour);

    

    //////////////////////////////////////////////////////////////////////////////
    // RÉCUPÉRATION DES INFOS STAGIAIRES DANS LA GOOGLE SHEET
    // MISE À JOUR DES INFORMATIONS SUR LE PAIEMENT DANS LA BASE DE DONNÉES GSHEET

    
    await GS_rassemblementidf.useServiceAccountAuth(GS_creds_rassemblementidf);
    await GS_rassemblementidf.loadInfo(); // loads document properties and worksheets
    logger.info("NOM FICHIER SHEET: " + GS_rassemblementidf.title, { numsession: req.session.id, label: filename });
    const GS_RI_sheet = GS_rassemblementidf.sheetsByTitle['inscription_web'];
    logger.info("NOM DU TABLEAU (ONGLET): " + GS_RI_sheet.title, { numsession: req.session.id, label: filename });

    // on récupère le contenu de la GSheet dans un array nommé "infos_adherents"
    const infos_adherents = await GS_RI_sheet.getRows();
    // on récupère quelle ligne contient l'identifiant concerné pour mettre à jour cette ligne
    let list_identifiants = new Array;
    let compteur = GS_RI_sheet.rowCount - 1;
    let rowToBeUpdate;
    logger.info("identifiant TRANSMIS PAR STRIPE :" + identifiant, { numsession: req.session.id, label: filename });
    for (let i=0; i<compteur; i++) {
        list_identifiants[i] = infos_adherents[i].identifiant;
        
        if (infos_adherents[i].identifiant === identifiant){
            logger.info("infos_adherents[i].identifiant TROUVE :" + infos_adherents[i].identifiant, { numsession: req.session.id, label: filename });
            logger.info("IDENTIFIANT TROUVÉ DANS LE ARRAY 'infos_adherents' à i = " + i, { numsession: req.session.id, label: filename });
            logger.info("infos_adherents[i].adherent_nom TROUVE :" + infos_adherents[i].adherent_nom, { numsession: req.session.id, label: filename });
            rowToBeUpdate = i;
        }
    }
    logger.info("infos_adherents[i].adherent_nom TROUVE GARDE :" + infos_adherents[rowToBeUpdate].adherent_nom, { numsession: req.session.id, label: filename });

    // DATE DE DU PAIEMENT
    moment().format();
    moment.locale('fr');
    var date_formattee = moment().format('L')
    console.log("date_formattee:", date_formattee);


    // MISE À JOUR DES INFORMATIONS SUR LE PAIEMENT DANS LA BASE DE DONNÉES GSHEET
    logger.info("rowToBeUpdate :" + rowToBeUpdate, { numsession: req.session.id, label: filename });
    infos_adherents[rowToBeUpdate].inscription_paye = 'paye';
    infos_adherents[rowToBeUpdate].status_inscription = 'CB_OK';
    infos_adherents[rowToBeUpdate].inscription_paiement_mode = payment_method_types[0];
    infos_adherents[rowToBeUpdate].inscription_paiement_CB_retour = CB_retour;
    infos_adherents[rowToBeUpdate].inscription_paiement_date = date_formattee;


    await infos_adherents[rowToBeUpdate].save(); // save updates
    

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

    logger.info("MAIL ENVOI AVANT", { numsession: req.session.id, label: filename });
    var transporter = nodemailer.createTransport({
        service: 'gmail',
        auth: {
            // TEST JULIE
          //user: 'juliechaumard@gmail.com',
          //pass: 'etfq umof iwbx ltxk'
          // SUZUKI
          user: 'afps.inscription@gmail.com',
          pass: 'vljxrkhwgljjracs'
        }
    });
    var mail_objet = "ASSOCIATION FRANÇAISE POUR LA PÉDAGOGIE SUZUKI - RASSEMBLEMENT IDF 2026 - ";
    mail_objet += infos_adherents[rowToBeUpdate].adherent_nom;
    mail_html = "<p>Cher adhérent,</p><p>Félicitations ! Vous êtes désormais inscrit au rassemblement Ile de France du 7 mai 2023 organisé par l’association La clef du bonheur et l’école de musique de Chambourcy, en partenariat avec l'Association Française pour la Pédagogie Suzuki.</p>";
    mail_html += "<p>La journée commence à 10h30 avec le premier atelier,  l'accueil est ouvert à partir de 9h30.</p>";
    mail_html += "<p>La journée se terminera après le concert vers  16h30  et un goûter sera offert aux enfants.</p>";
    mail_html += "<p>Apportez votre pique-nique pour le déjeuner de midi.</p>";
    mail_html += "<p>Pour ceux qui viennent en RER à la gare de Poissy,  des voitures / navettes attendront entre 9h15 et 9h45 maximum afin de vous conduire sur les lieux du rassemblement.</p>";
    mail_html += "<br>";
    mail_html += "<p>Vous trouverez en pièce jointe le programme à réviser et le plan d'accès pour le parking.</p>";
    mail_html += "<br>";
    mail_html += "<p>RÉCAPITULATIF :</p>";
    mail_html += "<p>Identifiant Suzuki : ";
    mail_html += identifiant;
    mail_html += "</p><p>Association Suzuki : ";
    mail_html += infos_adherents[rowToBeUpdate].association_suzuki;
    mail_html += "</p><p>Navette depuis Poissy RER A : ";
    mail_html += infos_adherents[rowToBeUpdate].bus_nb;
    mail_html += " personnes";
    mail_html += "</p><br>";
    mail_html += "</p><p>Accompagnant : ";
    mail_html += infos_adherents[rowToBeUpdate].accompagnant_prenom;
    mail_html += " ";
    mail_html += infos_adherents[rowToBeUpdate].accompagnant_nom;
    mail_html += "</p><br>";
    for (let toto = 1; toto<7; toto++) {
    if (infos_adherents[rowToBeUpdate]["personne_"+toto+"_nom"]) {
        mail_html += "<p>Nom : ";
        mail_html += infos_adherents[rowToBeUpdate]["personne_"+toto+"_nom"];
        mail_html += " ";
        mail_html += infos_adherents[rowToBeUpdate]["personne_"+toto+"_prenom"];
        mail_html += "</p><p>Date de naissance : ";
        mail_html += infos_adherents[rowToBeUpdate]["personne_"+toto+"_datenaissance"];
        mail_html += "</p>";
        if (infos_adherents[rowToBeUpdate]["personne_"+toto+"_instrument"]) {
            mail_html += "<p>Instrument : ";
            mail_html += infos_adherents[rowToBeUpdate]["personne_"+toto+"_instrument"];
            mail_html += " ";
            mail_html += infos_adherents[rowToBeUpdate]["personne_"+toto+"_cahier"];
            mail_html += " ";
            mail_html += infos_adherents[rowToBeUpdate]["personne_"+toto+"_piece"];
            mail_html += " ";
            mail_html += infos_adherents[rowToBeUpdate]["personne_"+toto+"_prof"];
            mail_html += "</p>";
        }
        if (infos_adherents[rowToBeUpdate]["personne_"+toto+"_activite_1"]) {
            mail_html += "<p>Activité : ";
            mail_html += infos_adherents[rowToBeUpdate]["personne_"+toto+"_activite_1"];
            mail_html += " ";
            mail_html += infos_adherents[rowToBeUpdate]["personne_"+toto+"_activite_2"];
            mail_html += "</p>";
        }
        mail_html += "<br>";
    }
    }

    mail_html += "<br>";
    mail_html += "<p>Tarif rassemblement : ";
    mail_html += infos_adherents[rowToBeUpdate].cout_rassemblement;
    mail_html += "€</p><p>Frais bancaire : ";
    mail_html += infos_adherents[rowToBeUpdate].frais_bancaire;
    mail_html += "€</p>Montant total : ";
    mail_html += infos_adherents[rowToBeUpdate].cout_total;
    mail_html += "€</p>";
      
    mail_html += "<p><br>Nous nous réjouissons de vous accueillir pour cette journée !</p><br><p>L’Association La clef du bonheur et l’école de musique de Chambourcy<br>Marie Vélu et Philippe Arestan<br>Pôle organisation du rassemblement</p>";

    var attachment_name = "rassemblementidf_plan_lieu.pdf";
    var pdfname = path.resolve(__dirname, "../public/images/rassemblementidf_plan_lieu.pdf");
    var attachment_name_2 = "rassemblementidf_2023_programme.pdf";
    var pdfname_2 = path.resolve(__dirname, "../public/images/rassemblementidf_2023_programme.pdf");

    var mailOptions = {
        from: 'afps.inscription@gmail.com',
        to: customer_email,
        subject: mail_objet,
        html: mail_html,
        attachments: [{
            filename: attachment_name,
            path: pdfname
        },{
            filename: attachment_name_2,
            path: pdfname_2
        }],
      };
      transporter.sendMail(mailOptions, function(error, info){
        if (error) {
          logger.info("error : " + error, { numsession: req.session.id});
        } else {
          logger.info("Email sent: " + info.response, { numsession: req.session.id});
        }
    });
    logger.info("MAIL ENVOI APRES", { numsession: req.session.id, label: filename });


    // REDIRECTION VERS LA PAGE DE CONFIRMATION PAIEMENT CARTE BANCAIRE
    res.locals.identifiant = infos_adherents[rowToBeUpdate].identifiant;
    res.locals.association = infos_adherents[rowToBeUpdate].association_suzuki;
    res.locals.adherent_nom = infos_adherents[rowToBeUpdate].adherent_nom;
    res.locals.adherent_prenom = infos_adherents[rowToBeUpdate].adherent_prenom;
    res.locals.adherent_adresse_rue = infos_adherents[rowToBeUpdate].adherent_adresse_rue;
    res.locals.adherent_adresse_complement = infos_adherents[rowToBeUpdate].adherent_adresse_complement;
    res.locals.adherent_adresse_codepostal = infos_adherents[rowToBeUpdate].adherent_adresse_codepostal;
    res.locals.adherent_adresse_ville = infos_adherents[rowToBeUpdate].adherent_adresse_ville;
    res.locals.adherent_adresse_pays = infos_adherents[rowToBeUpdate].adherent_adresse_pays;
    res.locals.adherent_telephone_mobile = infos_adherents[rowToBeUpdate].adherent_telephone_mobile;
    res.locals.adherent_telephone_fixe = infos_adherents[rowToBeUpdate].adherent_telephone_fixe;
    res.locals.adherent_mail = infos_adherents[rowToBeUpdate].adherent_mail;
    res.locals.accompagnant_prenom = infos_adherents[rowToBeUpdate].accompagnant_prenom;
    res.locals.bus_nb = infos_adherents[rowToBeUpdate].bus_nb;
    res.locals.accompagnant_nom = infos_adherents[rowToBeUpdate].accompagnant_nom;
    res.locals.commentaire_adherent = infos_adherents[rowToBeUpdate].commentaire_adherent;


    for (let toto = 1; toto < 7; toto++) {
        res.locals["personne_"+toto+"_numero"] = toto;
        res.locals["personne_"+toto+"_nom"] = infos_adherents[rowToBeUpdate]["personne_"+toto+"_nom"];
        res.locals["personne_"+toto+"_prenom"] = infos_adherents[rowToBeUpdate]["personne_"+toto+"_prenom"];
        res.locals["personne_"+toto+"_datenaissance"] = infos_adherents[rowToBeUpdate]["personne_"+toto+"_datenaissance"];
        res.locals["personne_"+toto+"_instrument"] = infos_adherents[rowToBeUpdate]["personne_"+toto+"_instrument"];
        res.locals["personne_"+toto+"_cahier"] = infos_adherents[rowToBeUpdate]["personne_"+toto+"_cahier"];
        res.locals["personne_"+toto+"_option_coursindividuel"] = infos_adherents[rowToBeUpdate]["personne_"+toto+"_piece"];
        res.locals["personne_"+toto+"_option_concertsolo"] = infos_adherents[rowToBeUpdate]["personne_"+toto+"_prof"];
    }
    res.locals.cout_rassemblement = infos_adherents[rowToBeUpdate].cout_rassemblement;
    res.locals.frais_bancaire = infos_adherents[rowToBeUpdate].frais_bancaire;
    res.locals.cout_total = infos_adherents[rowToBeUpdate].cout_total;

    if (!infos_adherents[rowToBeUpdate].identifiant) {
        res.locals.error = "Il y a eu une erreur lors de l'ajout de votre inscription dans la base de données du stage, veuillez contacter l'association.";
    }

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


/////////////////////////////////////////////////
// RETOUR PAIEMENT ECHOUE
// CLICK SUR BOUTON RECOMMENCER
const RI_accompte_annule = async function(req, res) {



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

    // RETOUR STRIPE
    var id = req.query.id;

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

    const session_stripe = await stripe.checkout.sessions.retrieve(id);

    var customer_email = session_stripe.customer_email;
    var payment_status = session_stripe.payment_status;
    var amount_total = session_stripe.amount_total/100;
    var stripe_customer = session_stripe.customer;
    var stripe_payment_intent = session_stripe.payment_intent;
    var payment_method_types = session_stripe.payment_method_types;
    var stripe_status = session_stripe.status;
    var identifiant = session_stripe.metadata.identifiant;
    var CB_retour = "identifiant_adherent:"+identifiant+",payment_status:"+payment_status+",stripe_customer:"+stripe_customer+",stripe_payment_intent:"+stripe_payment_intent+",sessionID:"+session_stripe.id+",payment_method_types:"+payment_method_types+",amount_total:"+amount_total+",stripe_status:"+stripe_status;
    logger.info("cookiesessionid APRES Stripe :" + session_stripe.metadata.cookiesessionid, { numsession: req.session.id, label: filename });
    var cookiesessionid = session_stripe.metadata.cookiesessionid;
    
    logger.info("payment_status : " + payment_status, { numsession: req.session.id, label: filename });
    

    //////////////////////////////////////////////////////////////////////////////
    // RÉCUPÉRATION DES INFOS STAGIAIRES DANS LA GOOGLE SHEET
    // ANNULATION DE L'INSCRIT DANS LA BASE DE DONNÉES GSHEET
    // GSHEET "identifiant" = ANNULE / "paye" = echec

    
    await GS_rassemblementidf.useServiceAccountAuth(GS_creds_rassemblementidf);
    await GS_rassemblementidf.loadInfo(); // loads document properties and worksheets
    logger.info("NOM FICHIER SHEET: " + GS_rassemblementidf.title, { numsession: req.session.id, label: filename });
    const GS_RI_sheet = GS_rassemblementidf.sheetsByTitle['inscription_web'];
    logger.info("NOM DU TABLEAU (ONGLET): " + GS_RI_sheet.title, { numsession: req.session.id, label: filename });

    // on récupère le contenu de la GSheet dans un array nommé "infos_adherents"
    const infos_adherents = await GS_RI_sheet.getRows();
    // on récupère quelle ligne contient l'identifiant concerné pour mettre à jour cette ligne
    let list_identifiants = new Array;
    let compteur = GS_RI_sheet.rowCount - 1;
    let rowToBeUpdate;
    logger.info("identifiant TRANSMIS PAR STRIPE :" + identifiant, { numsession: req.session.id, label: filename });
    for (let i=0; i<compteur; i++) {
        list_identifiants[i] = infos_adherents[i].identifiant;
        
        if (infos_adherents[i].identifiant === identifiant){
            logger.info("infos_adherents[i].identifiant TROUVE :" + infos_adherents[i].identifiant, { numsession: req.session.id, label: filename });
            logger.info("IDENTIFIANT TROUVÉ DANS LE ARRAY 'infos_adherents' à i = " + i, { numsession: req.session.id, label: filename });
            logger.info("infos_adherents[i].adherent_nom TROUVE :" + infos_adherents[i].adherent_nom, { numsession: req.session.id, label: filename });
            rowToBeUpdate = i;
        }
    }
    logger.info("infos_adherents[i].adherent_nom TROUVE GARDE :" + infos_adherents[rowToBeUpdate].adherent_nom, { numsession: req.session.id, label: filename });


    // ANNULATION INSCRIT DANS LA BASE DE DONNÉES GSHEET
    logger.info("rowToBeUpdate :" + rowToBeUpdate, { numsession: req.session.id, label: filename });
    infos_adherents[rowToBeUpdate].inscription_paye = 'echec';
    infos_adherents[rowToBeUpdate].status_inscription = 'CB_KO';
    await infos_adherents[rowToBeUpdate].save(); // save updates

    res.render('rassemblementidf/page_templates/paiement_annule');

}


/////////////////////////////////////////////////
// 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
}