/////////////////////////////////////////////////
// LOGGING
/////////////////////////////////////////////////
const logger = require("../../public/js/app/logger_lienventetemp");
/////////////////////////////////////////////////
// APPELS DES MODULES
/////////////////////////////////////////////////
const moment = require('moment');
const ejs = require('ejs');
const nodemailer = require('nodemailer');
const path = require("path");
const fs = require("fs");
const mysql = require('mysql2');
const mysql_promise = require('mysql2/promise');
////////////////////////////////////////////////////
// FILE NAME
////////////////////////////////////////////////////
const filename = path.parse(__filename).base;
// Envoie mail
const envoie_mail = require("../../modules/envoie_mail");

/////////////////////////////////////////////////
// GOOGLE SHEET PARAMETERS
/////////////////////////////////////////////////
const { GoogleSpreadsheet } = require('google-spreadsheet');
const GS_creds = require('../../inscriptionsafps-53b60452f63d.json');
const { error } = require("console");
// Initialize the sheet - doc ID is the long id in the sheets URL
const GS_boutique = new GoogleSpreadsheet(process.env.gsheet_boutique);

////////////////////////////////////////////////////
// Configuration de la connexion à la base de données
////////////////////////////////////////////////////
const dbConfig = {
    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
};
// OU
const { connect_DB_promise } = require('../../modules/db/databaseconnect');

////////////////////////////////////////////////////
// VARIABLES
////////////////////////////////////////////////////
// Stockage des fichiers avec une date d'expiration
const fileLinks = {};

// DATE
moment.locale('fr');
  var date_formattee = moment().format('L')
  var today = date_formattee;

////////////////////////////////////////////////////
// Générer le lien temporaire
////////////////////////////////////////////////////
const generate_link = async function(req, res) {
    logger.info("======================================", { label: filename });
    logger.info("generate_link", { label: filename });
    logger.info("======================================", { label: filename });


    try {
        // CONNEXION A LA BD
        const db_connection_promise = await mysql_promise.createConnection(dbConfig);

        const linkId = Date.now();
        const filePath = path.join(__dirname, 'files', 'film_suzuki_unesco_2024.mp4'); // Chemin du fichier
        let expiresAt = new Date(Date.now() + 24 * 60 * 60 * 1000); // 24 heures à partir de maintenant
        // Format de la date pour MySQL
        expiresAt = expiresAt.toISOString().slice(0, 19).replace('T', ' '); // 'YYYY-MM-DD HH:MM:SS'
        const link = `${process.env.DOMAIN_EXTERNE}boutique/unesco/download/${linkId}`;
        //const linkId = Date.now(); // Un identifiant unique basé sur le timestamp
        //fileLinks[linkId] = {
        //    filePath: filePath,
        //    expiresAt: Date.now() + 24 * 60 * 60 * 1000 // 24 heures
        //};
        
        let sql = 'INSERT INTO TemporaryLinks (id, link, filePath, expiresAt) VALUES ('+ linkId +', "'+ link +'", "'+ filePath +'", "'+ expiresAt +'")';
        console.log("sql : ", sql);
        const [results, fields] = await db_connection_promise.execute(sql);

        // L'ID généré par MySQL est accessible ici
        console.log("results.affectedRows : ", results.affectedRows);
        
        
        console.log("link : ", link);
        return link;
    } 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 });
        await db_connection_promise.end();
        return error;
        //return res.status(403).send('Il y a un problème avec la connection à  la base de données!');
  }
}


/////////////////////////////////////////////////
// WEBHOOK STRIPE
// APRÈS PAIEMENT PAIEMENT
// ENVOIE Lien temporaire par mail
/////////////////////////////////////////////////
async function wh_stripe_vente_video(req, res, event) {

    logger.info("======================================");
    logger.info("======== FUNCTION wh_stripe_vente_video ==========");
    logger.info("======================================");
  
    moment.locale('fr');
    var now = moment().format("DD/MM/YYYY");
    var dateheure = moment().format("YYYY-MM-DD HH-mm-ss");
    //console.log("event.data.object = ", event.data.object);
    //console.log("event.data.object.customer_details.email = ", event.data.object.customer_details.email);
    //console.log("event.data.object.customer_details.name = ", event.data.object.customer_details.name);
    
    try {
      /////////////////////////////////////////////////
      // SI PAIEMENT RÉUSSI
        if (event.data.object.payment_status === "paid") {



            // GÉNÉRATION DU LIEN DE TÉLÉCHARGEMENT TEMPORAIRE

            const linkId = Date.now();
            const filePath = path.join(__dirname, 'files', 'film_suzuki_unesco_2024.mp4'); // Chemin du fichier
            let expiresAt = new Date(Date.now() + 24 * 60 * 60 * 1000); // 2 heures à partir de maintenant
            console.log("Date.now() =", Date.now());
            console.log("expiresAt brut =", expiresAt);
            // Format de la date pour MySQL
            expiresAt = expiresAt.toISOString().slice(0, 19).replace('T', ' '); // 'YYYY-MM-DD HH:MM:SS'
            console.log("expiresAt formatée =", expiresAt);
            const link = `${process.env.DOMAIN_EXTERNE}boutique/unesco/download/${linkId}`;

    
            //Connexion DB
            let db_connection_promise = await connect_DB_promise();
            
            // AJOUT DE LA VENTE DANS LA TABLE " VENTE VIDEOS" DE LA BASE DE DONNÉES ADUZUKI

            let sql = `INSERT INTO boutique (date, name, email, produit, originPath, link, expiresAt, montant, status_paiement, stripe) VALUES ('${dateheure}', '${event.data.object.customer_details.name}', '${event.data.object.customer_details.email}', 'Film UNESCO 2024', '${filePath}', '${link}', '${expiresAt}', ${event.data.object.amount_total}/100, '${event.data.object.payment_status}', '${event.data.object.id}')`;
            logger.info("#2 sql : " + sql, { numsession: req.session.id, label: filename});
        
            // lancement de la requête
            const [result_sql, fields] = await db_connection_promise.execute(sql);
            logger.info("#2 result_sql Row ID added : " + result_sql.affectedRows, { numsession: req.session.id, label: filename});

            /////////////////////////////////////////////////
            // ENVOIE MAIL CONFIRM + JUSTIF
            
            var mail_objet = `ASSOCIATION FRANÇAISE POUR LA PÉDAGOGIE SUZUKI - ACHAT FILM - ${event.data.object.customer_details.name}`;
            var mail_html = `<p>Bonjour,</p><br><p>Suite à l'achat du film du Concert National Suzuki du 21 avril 2024 au Palais de l'UNESCO Paris, voici le lien de téléchargement du fichier vidéo. Ce lien est valable jusqu'au ${expiresAt} : <br> Cliquez sur ce lien pour accéder à la page de téléchargement du film : ${link} </p><br><p>Association Française pour la pédagogie Suzuki</p>`;
            var mailOptions = {
            from: 'afps.inscription@gmail.com',
            to: event.data.object.customer_details.email,
            subject: mail_objet,
            html: mail_html,
            };
            envoie_mail.envoie_mail(mailOptions);
    
            /////////////////////////////////////////////////
            // AJOUT GOOGLE SHEET
            await GS_boutique.useServiceAccountAuth(GS_creds);
            await GS_boutique.loadInfo();
            let GS_sheet_boutique = GS_boutique.sheetsByTitle['achats'];
            await GS_sheet_boutique.addRows (
            [
                {
                    date: dateheure,
                    nom: event.data.object.customer_details.name,
                    email: event.data.object.customer_details.email,
                    produit: 'Film UNESCO 2024',
                    lien: link,
                    lien_expire_le: expiresAt,
                    montant: event.data.object.amount_total/100,
                    statut_paiement: event.data.object.payment_status,
                    stripe: event.data.object.id
                }
            ]
            );
            logger.info("AJOUT GOOGLESHEET FIN", { numsession: req.session.id, label: filename});
    
        }
  
  
    } catch (error) {
        // Echec de connection à la BD
        logger.error("Il y a un problème avec wh_stripe_vente_video : " + error, { numsession: req.session.id });
        return res.status(400).send(`Webhook Error: ${error.message}`);
    }
  
    res.json({ received: true });
  
}

////////////////////////////////////////////////////
// Download le fichier
////////////////////////////////////////////////////
const download_file = async function(req, res) {

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

    const link = process.env.DOMAIN_EXTERNE_SS_SLASH+req.originalUrl;
    logger.info("link : " + link, { numsession: req.session.id });

    try {
        // CONNEXION A LA BD pour vérifier l'expiration du lien temporaire et récupérer le lien original pour downloader le fichier 
        const db_connection_promise = await mysql_promise.createConnection(dbConfig);

        // Requête pour récupérer les infos d'après le code contenu dans le lien temporaire
        let sql = 'SELECT originPath, expiresAt FROM boutique WHERE link = "'+ link+'"';
        logger.info("sql FROM boutique : " + sql, { numsession: req.session.id });
        const [rows] = await db_connection_promise.execute(sql);
        logger.info("rows.length : " + rows.length, { numsession: req.session.id });
        req.session.originPath = rows[0].originPath;
        // Si le lien temporaire à été trouvé (grâce au code contenu dans le lien qui est l'id)
        if (rows.length > 0) {
            logger.info("rows.expiresAt : " + rows[0].expiresAt, { numsession: req.session.id });
            logger.info("Date.now() : " + Date.now(), { numsession: req.session.id });
            const expiresAt = new Date(rows[0].expiresAt);
            req.session.expiresAt = rows[0].expiresAt;
            logger.info("expiresAt : " + expiresAt, { numsession: req.session.id });

            // SI le lien n'a pas expiré on peut télécharger le fichier
            if (Date.now() < expiresAt.getTime()) {
                
                
                return rows[0].originPath;
            } else {
                return "Lien expiré"
            }
        } else {
            return "Lien non trouvé"
        }
    } 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 });
        await db_connection_promise.end();
        return error;
    }
}

/////////////////////////////////////////////////
// EXPORT DE MODULE POUR QU'IL SOIT LU DANS LES AUTRES FICHIERS JS
/////////////////////////////////////////////////
module.exports = {
    generate_link,
    download_file,
    wh_stripe_vente_video
}

