const express = require('express')
const mysql = require("mysql")
const dotenv = require('dotenv')
const app = express()
const path = require("path")
const publicDir = path.join(__dirname, './public')
var bodyParser = require('body-parser')

/* Connexion à la BDD MySQL */
dotenv.config({ path: './.env'})
const db = mysql.createConnection({
    host: process.env.DATABASE_HOST,
    port: process.env.DATABASE_PORT,
    user: process.env.DATABASE_USER,
    password: process.env.DATABASE_PASSWORD,
    database: process.env.DATABASE
})
db.connect((error) => {
    if(error) {
        console.log(error)
    } else {
        console.log("MySQL connected!")
    }
})


app.set('view engine', 'hbs');
app.use(express.static(publicDir));
/* Pour utiliser le bootstrap local */
app.use('/css', express.static(__dirname + '/node_modules/bootstrap/dist/css'));
/* configure the Express.js server to receive the form values as JSON */
app.use(bodyParser.urlencoded({extended: false}));
app.use(express.json())


const isEqual = function(a, b, opts) {
    if (a == b) {
      return opts.fn(this) 
    } else { 
      return opts.inverse(this) 
    } 
  }
  
var hbs = require('hbs');
const { exit } = require('process')
hbs.registerHelper('equals', isEqual);


app.get("/", (req, res) => { 

    db.query('SELECT c.id as "id", c.libelle as "libelle", c.prix, c.photo as "photo", c.lien, p.prenom as "acheteur", c.achete as "achete", c.paye as "paye", p2.prenom as "responsableAchat", c.pour_noel as "pourNoel", c.emballe as "emballe" FROM cadeau c LEFT OUTER JOIN participations pc on pc.cadeau = c.id LEFT OUTER JOIN participant p on p.id = pc.offrant LEFT OUTER JOIN participant p2 on p2.id = pc.responsable_achat ORDER BY c.pour_noel, c.prix', async (error, resultCadeaux) => {
        let message;

        if(error){
            console.log(error);
        }
        if (resultCadeaux && resultCadeaux.length == 0) {
            console.log("Aucun cadeau");
            message = "Aucun cadeau pour l'instant";
        }
        res.render('index', { message: message, cadeaux: resultCadeaux })
    })
 });


app.get("/choix-offrant", (req, res) => { 
    let cadeau = req.query.cadeau;

    db.query('SELECT id, prenom FROM participant ORDER BY prenom', async (error, result) => {
        if(error) {
            console.log(error);
        }
        if (result && result.length > 0) {
            res.render('offrant', { "cadeau" : cadeau, "listeOffrants": result});
        }
    })
})


app.get("/reservation", (req, res) => { 

    let reqCadeau = req.query.cadeau;
    let reqOffrant = req.query.offrant;
    let totalAchats;

    db.query('SELECT id, libelle, prix, photo, lien, achete, paye, pour_noel as "pourNoel" FROM cadeau WHERE id = ?', [reqCadeau], async (error, infosCadeau) => {
        if(error) {
            console.log(error);
        }
        if (infosCadeau.length > 0) {
            db.query('SELECT COALESCE(sum(c.prix),0) as "total" FROM cadeau c RIGHT OUTER JOIN participations pc ON pc.cadeau = c.id INNER JOIN participant p ON p.id = pc.offrant WHERE p.id=?', [reqOffrant], async (error, result) => {
                if(error) {
                    console.log(error);
                }
                if (result && result.length > 0) {
                    totalAchats = result[0]
                }

                db.query('SELECT id, prenom FROM participant WHERE id=?', [reqOffrant], async (error, result) => {
                    if(error) {
                        console.log(error);
                    }
                    if (result && result.length > 0) {
                        offrant = result[0];
                    }
                });

                db.query('SELECT id, prenom FROM participant ORDER BY prenom', async (error, listeResponsables) => {
                    if(error) {
                        console.log(error);
                    }
                    res.render('reservation', { "infosCadeaux": infosCadeau[0],
                                                "offrant" : offrant,
                                                "totalAchats": totalAchats.total,
                                                "listeResponsables" : listeResponsables} );
                })
            })
        }
    })
});



app.post("/confirm-reservation", (req, res) => { 
    const { cadeau, offrant, achete, paye, occasion, responsableAchat } = req.body

    db.query('UPDATE cadeau SET achete=?, paye=?, pour_noel=? WHERE ID=?', [achete, paye, occasion, cadeau], function (err, result) {
        if (err) throw err;
        console.log("1 record updated");
      });

    db.query('INSERT INTO participations (offrant, cadeau, responsable_achat) VALUES (?, ?, ?)', [offrant, cadeau, responsableAchat], function (err, result) {
        if (err) throw err;
        console.log("1 record inserted");
      });

    res.redirect('/');
});


// Pour voter sur la présence à son anniversaire
app.get("/presence-anniversaire", (req, res) => { 
    var child_process = require("child_process");
    let enfant = req.query.e;
    let present = req.query.p;
    let messageNotif = enfant + (present == 'true' ? "" : " ne") + " sera" + (present == 'true' ? "" : " pas") + " là le 17 décembre";

    db.query("DELETE FROM anniversaire WHERE enfant = ?", [enfant], function (err, result) {
        if (err) throw err;

        db.query("INSERT INTO anniversaire (enfant, present) VALUES (?, ?)", [enfant, (present == 'true' ? 1 : 0)], function (err, result) {
            if (err) throw err;

            child_process.exec("hostname -f", function(err, stdout, stderr) {
                var hostname = stdout.trim();
                if (hostname == "NAS") {
                    fetch('http://127.0.0.1:5202/anniv-louisa', {
                        method: "POST",
                        body: messageNotif
                    })    
                } else {
                    fetch('https://ntfy.sh/presence-anniversaire-louisa', {
                        method: "POST",
                        body: messageNotif
                    })    
                }
            });
            res.render('votre-vote', { "enfant": enfant, "present": (present == 'true' ? 1 : 0) });
        });
    });
});

app.get("/anniv", (req, res) => {

    db.query('SELECT enfant as "prenom" FROM anniversaire WHERE present = 1 ORDER BY prenom', async (error, result) => {
        if(error) {
            console.log(error);
        }
        res.render('presence', { presents: result } );
    });    
});


app.listen(5006, ()=> {
    console.log("server started on port 5006")
});
