const express = require('express');
const mongodb = require('mongodb')
const bcrypt = require('bcryptjs');

const db = require('../data/database');

const router = express.Router();

router.get('/creer-compte', function (req, res) {
  let sessionInputData = req.session.inputData;
  req.session.input = null;
  res.render('creer_compte', {inputData: sessionInputData});
});

router.post('/creer-compte', async function (req, res) {
  const userData = req.body;
  const enteredNom = userData.nom;
  const enteredPrenom = userData.prenom;
  const enteredNom_dutilisateur = userData.nom_dutilisateur;
  const enteredEmail = userData.email;
  const enteredConfirmEmail = userData['confirm-email'];
  const enteredPassword = userData.password;
  const enteredConfirmPassword = userData['confirm-password'];
  console.log("here1")
  if (!enteredNom ||
    !enteredPrenom ||
    !enteredNom_dutilisateur ||
    !enteredEmail ||
    !enteredConfirmEmail ||
    !enteredConfirmPassword ||
    !enteredPassword ||
    enteredPassword < 6 ||
    enteredEmail !== enteredConfirmEmail ||
    enteredPassword !== enteredConfirmPassword ||
    !enteredEmail.includes('@')
  ) {
    req.session.inputData = {
      hasError: true,
      message: 'Invalid input - please check your data.',
      nom: enteredNom,
      prenom: enteredPrenom,
      nom_dutilisateur: enteredNom_dutilisateur,
      email: enteredEmail,
      confirmEmail: enteredConfirmEmail,
      password: enteredPassword,
      confirmPassword: enteredConfirmPassword
    };

    req.session.save(function () {
      res.redirect('/creer-compte')
    });
    return;
  }
  const existingUser1 = await db.getDb().collection('users').findOne({email: enteredEmail})
  const existingUser2 = await db.getDb().collection('users').findOne({nom_dutilisateur: enteredNom_dutilisateur})

  if (existingUser1 || existingUser2) {
    req.session.inputData = {
      hasError: true,
      message: 'User exists already!',
      nom: enteredNom,
      prenom: enteredPrenom,
      nom_dutilisateur: enteredNom_dutilisateur,
      email: enteredEmail,
      confirmEmail: enteredConfirmEmail,
      password: enteredPassword,
      confirmPassword: enteredConfirmPassword
    };
    req.session.save(function () {
      res.redirect('/creer-compte')
    });
    return;
  }
  const hashedPassword = await bcrypt.hash(enteredPassword, 12);

  const user = {
    nom: enteredNom,
    prenom: enteredPrenom,
    nom_dutilisateur: enteredNom_dutilisateur,
    email: enteredEmail,
    password: hashedPassword,
    isAdmin: false
  }

  await db.getDb().collection('users').insertOne(user);

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

router.get('/connexion', function (req, res) {
  let sessionInputData = req.session.inputData;
  req.session.input = null;
  res.render('connexion', {inputData: sessionInputData});
});



router.post('/connexion', async function (req, res) {
  const userData = req.body;
  const enteredNom_dutilisateur = userData.nom_dutilisateur;
  const enteredPassword = userData.password;

  const existingUser1 = await db.getDb().collection('users').findOne({nom_dutilisateur: enteredNom_dutilisateur});
  const existingUser2 = await db.getDb().collection('users').findOne({email: enteredNom_dutilisateur})

  if (!existingUser1 && !existingUser2) {
    req.session.inputData = {
      hasError: true,
      message: 'Could not log you in - please check your credentials!',
      nom_dutilisateur: enteredNom_dutilisateur,
      password: enteredPassword,
    };
    req.session.save(function () {
      res.redirect('/connexion')
    })
    return;
  }
  if (existingUser1) {
    const passwordsAreEqual = await bcrypt.compare(enteredPassword, existingUser1.password);
    if (!passwordsAreEqual) {
      req.session.inputData = {
        hasError: true,
        message: 'Could not log you in - please check your credentials!',
        nom_dutilisateur: enteredNom_dutilisateur,
        password: enteredPassword,
      };
      req.session.save(function () {
        res.redirect('/connexion')
      })
      return;
    }
    req.session.user = { id: existingUser1._id, nom_dutilisateur: existingUser1.nom_dutilisateur, nom: existingUser1.nom, prenom: existingUser1.prenom, email: existingUser1.email};
    req.session.isAuthenticated = true;
    req.session.save(function () {
      return res.redirect('/');
    });
    return
  }

  const passwordsAreEqual = await bcrypt.compare(enteredPassword, existingUser2.password);

  if (!passwordsAreEqual) {
    req.session.inputData = {
      hasError: true,
      message: 'Could not log you in - please check your credentials!',
      nom_dutilisateur: enteredNom_dutilisateur,
      password: enteredPassword,
    };
    req.session.save(function () {
      res.redirect('/connexion')
    })
    return;
  }
  req.session.user = { id: existingUser2._id, nom_dutilisateur: existingUser2.nom_dutilisateur, nom: existingUser2.nom, prenom: existingUser2.prenom, email: existingUser2.email};
  req.session.isAuthenticated = true;
  req.session.save(function () {
    return res.redirect('/');
  });
});

router.post('/supprimer-compte', function (req,res) {
  db.getDb().collection('users').deleteOne({_id: req.session.id})
  req.session.user = null;
  req.session.isAuthenticated = false;
  res.redirect('/');
})


router.post('/logout', function (req, res) {
  req.session.user = null;
  req.session.isAuthenticated = false;
  res.redirect('/');
});

router.post('/mettreAdmin', async function (req,res) {
  const enteredNomDutilisateur = req.body.utilisateurs;
  await db.getDb().collection('users').updateOne({nom_dutilisateur: enteredNomDutilisateur}, {$set: {isAdmin: true}})
  return res.redirect('/admin')
})

router.post('/supprAdmin', async function (req,res) {
  const enteredNomDutilisateur = req.body.utilisateurs;
  await db.getDb().collection('users').updateOne({nom_dutilisateur: enteredNomDutilisateur}, {$set: {isAdmin: false}})
  return res.redirect('/admin')
})

module.exports = router