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

/////////////////////////////////////////////////
// APPELS DES MODULES
/////////////////////////////////////////////////
const path = require("path");
const fs = require("fs");
// CALCUL DE DATE
const moment = require('moment');
// ENVOIE MAIL GOOGLE MAIL
const nodemailer = require('nodemailer');
// CONNECTION BASE DE DONNÉES
const mysql = require('mysql2');
const mysql_promise = require('mysql2/promise');



/////////////////////////////////////////////////
// APPELS DES FONCTIONS
/////////////////////////////////////////////////
const sleep = require("./../../modules/sleep");

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

////////////////////////////////////////////////////
// CONNECTION DB
////////////////////////////////////////////////////
async function connect_DB_promise() {
    return db_connection_promise = await mysql_promise.createConnection({
        host: process.env.db_connection_host,
        port: process.env.db_connection_port,
        user: process.env.db_connection_user,
        password: process.env.db_connection_password,
        database: process.env.db_connection_database
    });
}

/////////////////////////////////////////////////
// PAGE 1
// DOMAINconcert/identifier
// 2. SAISIE DU L'IDENTIFIANT
// VÉRIFICATION SI L'IDENTIFIANT EST ADHÉRENT
/////////////////////////////////////////////////

const checkidentifiant = async function (req, res) {

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

    function affiche_page_admin() {
        ////////////////////////////////////////////////////
        // AFFIHER LA PAGE /identifier
        // AFFICHAGE DES ERREURS
        // EN CAS DE RETOUR SUR LA PAGE AVEC ERREUR :
        //  - SI IDENTIFIANT NON ADHÉRENT
        //  - SI RIEN SAISIE
        ////////////////////////////////////////////////////

        if (req.session.err_mail_form_adhesion_1) {
            res.locals.err_mail_form_adhesion_1 = req.session.err_mail_form_adhesion_1;
            res.locals.err_mail_form_adhesion_2 = req.session.err_mail_form_adhesion_2;
            res.locals.err_mail_form_adhesion_3 = req.session.err_mail_form_adhesion_3;
            // on supprime le contenu après affichage
            req.session.err_mail_form_adhesion_1 = undefined;
            req.session.err_mail_form_adhesion_2 = undefined;
            req.session.err_mail_form_adhesion_3 = undefined;
        }
        res.render('concert/page_templates/admin');
    };

    // VARIABLES
    req.session.quota_spectateur = "nondepasse";
    req.session.quota_concertiste = "nondepasse";


    ////////////////////////////////////////////////////
    // ON RÉCUPÈRE LE NOMBRE DE PLACES DÉJA COMMANDÉES DANS LA BASE DE DONNÉES
    // !!! ATTENTION IL FAUT QUE LES NOMBRES SOIENT A ZÉRO AU DÉMMARAGE dans la table ca_decompte_place
    ////////////////////////////////////////////////////

    async function recup_nb_places () {
        logger.info("==================================================================", { label: filename });
        logger.info("======== ON RÉCUPÈRE LE NOMBRE DE PLACES DÉJA COMMANDÉES DANS LA BASE DE DONNÉES ==========", { label: filename });

        // CONNECTION DB PROMISE
        try {
            //Connexion
            let db_connection_promise = await connect_DB_promise();
            //Query
            let sql = 'select spectateur_commandes,encadr_parent_commandes,piano_commandes,alto_commandes,flute_commandes,trompette_commandes,harpe_commandes,violon1_commandes,violon2_commandes,violoncelle1_commandes,violoncelle2_commandes from ca_decompte_place';
            const [results, fields] = await db_connection_promise.execute(sql);

            req.session.spectateur_nb_restantes = process.env.spectateur_nb_places - results[0].spectateur_commandes;
            req.session.encadr_parent_nb_restantes = process.env.encadr_parent_nb_places - results[0].encadr_parent_commandes;
            req.session.piano_nb_restantes = process.env.piano_nb_places - results[0].piano_commandes;
            req.session.alto_nb_restantes = process.env.alto_nb_places - results[0].alto_commandes;
            req.session.flute_nb_restantes = process.env.flute_nb_places - results[0].flute_commandes;
            req.session.trompette_nb_restantes = process.env.trompette_nb_places - results[0].trompette_commandes;
            req.session.harpe_nb_restantes = process.env.harpe_nb_places - results[0].harpe_commandes;
            req.session.violon1_nb_restantes = process.env.violon1_nb_places - results[0].violon1_commandes;
            req.session.violon2_nb_restantes = process.env.violon2_nb_places - results[0].violon2_commandes;
            req.session.violoncelle1_nb_restantes = process.env.violoncelle1_nb_places - results[0].violoncelle1_commandes;
            req.session.violoncelle2_nb_restantes = process.env.violoncelle2_nb_places - results[0].violoncelle2_commandes;

            res.locals.spectateur_nb_restantes = req.session.spectateur_nb_restantes;
            res.locals.encadr_parent_nb_restantes = req.session.encadr_parent_nb_restantes;
            res.locals.piano_nb_restantes = req.session.piano_nb_restantes;
            res.locals.alto_nb_restantes = req.session.alto_nb_restantes;
            res.locals.flute_nb_restantes = req.session.flute_nb_restantes;
            res.locals.trompette_nb_restantes = req.session.trompette_nb_restantes;
            res.locals.harpe_nb_restantes = req.session.harpe_nb_restantes;
            res.locals.violon1_nb_restantes = req.session.violon1_nb_restantes;
            res.locals.violon2_nb_restantes = req.session.violon2_nb_restantes;
            res.locals.violoncelle1_nb_restantes = req.session.violoncelle1_nb_restantes;
            res.locals.violoncelle2_nb_restantes = req.session.violoncelle2_nb_restantes;

            
        } catch (error) {
            // Echec de connection à la BD
            logger.error("Il y a un problème avec la connection à la base de données! : " + 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.";
            //await db_connection_promise.end();
            
        }
    }

    recup_nb_places();


     /////////////////////////////////////////////////
    // RECHERCHE DANS DB 
    //      - SI IDENTIFIANT SAISIE EST DÉJÀ INSCRIT AU CONCERT

    

    /////////////////////////////////////////////////
    // ON RÉCUPÈRE L'IDENTIFIANT SAISIE DANS LE FORMULAIRE
    // ON REGARDE S'il à bien rempli l'identifiant et s'il a coché la case "je ne suis pas adhérent"
    logger.info("identifiant saisi : " + req.body.identifiant, { numsession: req.session.id, label: filename});

    if (req.body.identifiant  && req.body.check_nonadherent) {
        req.session.err_mail_form_adhesion_1 = "Pour vous inscrire au concert, 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 = 'Pour adhérer <a target="_blank" href="https://www.inscription.afpedagogiesuzuki.fr/adhesion/"><span class="souligne">Cliquez ici</span></a>';
        req.session.err_mail_form_adhesion_3 = '';
        affiche_page_admin();
    }
    if (!req.body.identifiant  && req.body.check_nonadherent) {
        req.session.err_mail_form_adhesion_1 = "Pour vous inscrire au concert, 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 = 'Pour adhérer <a target="_blank" href="https://www.inscription.afpedagogiesuzuki.fr/adhesion/"><span class="souligne">Cliquez ici</span></a>';
        req.session.err_mail_form_adhesion_3 = '';
        affiche_page_admin();
    }
    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).";
        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>';
        affiche_page_admin();
    }
    if (req.body.identifiant && !req.body.check_nonadherent) {
        // SAISIE OK
        req.session.identifiant = req.body.identifiant;

        // EST-CE QUE L'IDENTIFIANT SAISI EST DÉJA INSCRIT AU CONCERT TABLE ca_adherent

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

            //Query
            let sql = 'select identifiant, association_suzuki, adherent_mail, commande_nb_spectateur, commande_nb_concertiste from ca_adherent where identifiant = "' + req.session.identifiant + '"';
            const [results, fields] = await db_connection_promise.execute(sql);
            logger.info("Row ca_adherent : " + results.length, { numsession: req.session.id, label: filename});

            if (results.length) {
                // DÉJA INSCRIT AU CONCERT
                logger.info("Identifant déjà inscrit au concert.", { numsession: req.session.id, label: filename});

                // TAG ADHÉRENT DÉJÀ INSCRIT
                req.session.deja_inscrit_concert = "oui";

                // QUOTA GÉNÉRAL DE PLACES TOTALES
               let sql_ca_decompte_place = 'select spectateur_commandes from ca_decompte_place';
               const [results_ca_decompte_place, fields_ca_decompte_place] = await db_connection_promise.execute(sql_ca_decompte_place);
               logger.info("SQL nombre de places spectateurs déjà commandées : " + results_ca_decompte_place[0].spectateur_commandes, { numsession: req.session.id, label: filename});
               // ON REGARDE LE NOMBRE DE SPECTATEURS DÉJÀ INSCRITS
                             
                // QUOTA GÉNÉRAL ATTEINT
                if (results_ca_decompte_place[0].spectateur_commandes >= process.env.spectateur_nb_places){
                    // QUOTA DÉPASSÉ
                    logger.info("Quota spectateur TOTAL dépassé : " + results[0].commande_nb_spectateur, { numsession: req.session.id, label: filename});
                    req.session.err_mail_form_adhesion_1 = "Le nombre total de spectateurs a été atteint.";
                    req.session.err_mail_form_adhesion_2 = "Vous ne pouvez plus commander de places";
                    affiche_page_identifier();
                }

                // NOMBRE DE PLACES TOTALES RESTANTES
                req.session.quota_total_spectateur = process.env.spectateur_nb_places - results_ca_decompte_place[0].spectateur_commandes;
                logger.info("NOMBRE DE PLACES TOTALES RESTANTES : " + req.session.quota_total_spectateur, { numsession: req.session.id, label: filename});

                // ON REGARDE LE NOMBRE DE PARTICIPANTS DÉJÀ INSCRITS
                if (results[0].commande_nb_spectateur > 6){
                    req.session.quota_spectateur = "depasse";
                }

                if (results[0].commande_nb_concertiste > 3){
                    req.session.quota_concertiste = "depasse";
                }
                logger.info("req.session.quota_spectateur = " + req.session.quota_spectateur , { numsession: req.session.id, label: filename});
                logger.info("req.session.quota_concertiste = " + req.session.quota_concertiste , { numsession: req.session.id, label: filename});

                // On calcule le nombre de places concertistes restantes (tous instruments)
                req.session.tout_instrument_nb_restantes = req.session.piano_nb_restantes + req.session.alto_nb_restantes + req.session.flute_nb_restantes + req.session.trompette_nb_restantes + req.session.harpe_nb_restantes + req.session.violon1_nb_restantes + req.session.violon2_nb_restantes + req.session.violoncelle1_nb_restantes + req.session.violoncelle2_nb_restantes;
                logger.info("NOMBRE DE PLACES TOUT INSTRUMENTS (session) = " + req.session.tout_instrument_nb_restantes, { numsession: req.session.id, label: filename});

                // On récupère le nom de l'association Suzuki et le mail de l'adhérent
                req.session.adherent_mail = results[0].adherent_mail;
                logger.info("req.session.adherent_mail = " + req.session.adherent_mail , { numsession: req.session.id, label: filename});
                req.session.association_suzuki = results[0].association_suzuki;
                // ON AFFICHE LA PAGE DU FORMULAIRE DE SAISIE DES INFORMATIONS DE L'INSCRIPTION
                res.redirect('/concert/admin/inscription_famille');
                
                //req.session.err_mail_form_adhesion_1 = "Vous êtes déjà inscrit au Concert national Unesco.";
                //affiche_page_admin();
            

            } else {
                // NON INSCRIT AU CONCERT
                logger.info("Identifant non inscrit au concert.", { numsession: req.session.id, label: filename});
                // TAG ADHÉRENT DÉJÀ INSCRIT
                req.session.deja_inscrit_concert = "non";

                /////////////////////////////////////////////////
                // RECHERCHE SI PERSONNE EST ADHÉRENTE À L'AFPS
                // DANS BD ADHESION adherent

                sql = 'select identifiant,association_suzuki from adherent where identifiant = "' + req.session.identifiant + '"';
                //Query
                const [results, fields] = await db_connection_promise.execute(sql);
                logger.info("Row adherent : " + results.length, { numsession: req.session.id, label: filename});
                if (results.length === 1) {
                    // LA PERSONNE EST BIEN ADHÉRENTE
                    logger.info("identifiant BD adhérent : " + results[0].identifiant, { numsession: req.session.id, label: filename});
                    req.session.association_suzuki = results[0].association_suzuki;
                    // On calcule le nombre de places concertistes restantes (tous instruments)
                    req.session.tout_instrument_nb_restantes = req.session.piano_nb_restantes + req.session.alto_nb_restantes + req.session.flute_nb_restantes + req.session.trompette_nb_restantes + req.session.harpe_nb_restantes + req.session.violon1_nb_restantes + req.session.violon2_nb_restantes + req.session.violoncelle1_nb_restantes + req.session.violoncelle2_nb_restantes;
                    logger.info("NOMBRE DE PLACES TOUT INSTRUMENTS (session) = " + req.session.tout_instrument_nb_restantes, { numsession: req.session.id, label: filename});
                     // ON AFFICHE LA PAGE DU FORMULAIRE DE SAISIE DES INFORMATIONS DE L'INSCRIPTION
                     res.redirect('/concert/admin/inscription_famille');
                } else {
                    // LA PERSONNE N'EST PAS ADHÉRENTE
                    logger.info("Identifant NON adhérent.", { numsession: req.session.id, label: filename});
                    req.session.err_mail_form_adhesion_1 = "Cet identifiant N'EST PAS 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 concert.";
                    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>';
                    affiche_page_admin();
                }
            }

        } catch (error) {
            // Echec de connection à la BD
            logger.error("Il y a un problème avec la connection à la base de données! : " + 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.";
            //await db_connection_promise.end();
            affiche_page_admin();
        }

    }

}

/////////////////////////////////////////////////
// EXPORT DES MODULES POUR QU'ILS PUISSENT LUS PAR LES AUTRES FICHIERS JS
/////////////////////////////////////////////////

module.exports = {
    checkidentifiant
}
