const mysql = require('mysql');
const fetch = require('node-fetch');
var secrets = require('../secrets.js');
var dbhost = secrets.dbhost;
var dbuser = secrets.dbuser;
var dbpassword = secrets.dbpassword;
var dbdatabase = secrets.dbdatabase;

const dbConfig = {
  host: dbhost,
  user: dbuser,
  password: dbpassword,
  database: dbdatabase
};

function getAdministrateurs(req, res) {
  var con = mysql.createConnection(dbConfig);
  var query = "SELECT id,login FROM Admin WHERE deleted = 0 ORDER BY login ASC;"
  con.connect();
  con.query(query, (err, result) => {
    if (err) {
      console.log(err)
      return res.send({ success: false })
    }
    return res.send(result)
  });
  con.end();
}

function addNewAdministrateur(req, res) {
  var con = mysql.createConnection(dbConfig);
  var query = "INSERT INTO `Admin` (`login`) VALUES (?);";
  var inserts = [req.body.login];
  con.connect();
  con.query(query, inserts, (err, result) => {
    if (err) {
      console.log(err)
      return res.send({ success: false })
    }
    return res.send(result)
  });
  con.end();
}

function updateAdministrateur(req, res) {
  var con = mysql.createConnection(dbConfig);
  var query = "UPDATE Admin SET login = ? WHERE id=?;"
  var inserts = [req.body.login, req.body.id];
  con.connect();
  con.query(query, inserts, (err, result) => {
    if (err) {
      console.log(err)
      return res.send({ success: false })
    }
    return res.send(result)
  });
  con.end();
}

function deleteAdministrateur(req, res) {
  var con = mysql.createConnection(dbConfig);
  var query = "UPDATE Admin SET deleted = 1 WHERE id=?;"
  var inserts = [req.body.id];
  con.connect();
  con.query(query, inserts, (err, result) => {
    if (err) {
      console.log(err)
      return res.send({ success: false })
    }
    return res.send(result)
  });
  con.end();
}

function getAdminsLogins(req, res) {
  var con = mysql.createConnection(dbConfig);
  var query = "SELECT login FROM Admin WHERE deleted = 0;"
  con.connect();
  con.query(query, (err, result) => {
    if (err) {
      console.log(err)
      return res.send({ success: false })
    }
    var data = result.map((item) => { return item.login });
    return res.send(data)
  });
  con.end();
}

async function getUsers(req, res) {
  if (!req.session || !req.session.ids || !req.query.userString || req.query.userString.length < 3) {
    res.json([]);
  } else {
    let result;
    const request = `query{searchUsers(name:"${req.query.userString}",limit:10){user{firstName,lastName,login}}}`;
    const query = `https://api.linkcs.fr/v1/graphql/?query=${encodeURIComponent(request)}`;
    console.log(query)
    await fetch(query, {
      method: 'GET',
      headers: {
        'Authorization': `Bearer ${req.session.ids.token.access_token}`
      }
    }).then(async (resp) => {
      if (resp.status != 200) {
        res.status(500);
        res.json({ error: "Didn't work" });
      } else {
        result = await resp.json();
      }
    }).catch(err => {
      res.status(500);
      res.send(err)
    })
    if (result) {
      console.log(result)
      return res.json(result.data.searchUsers.map(el => el.user))
    } else {
      res.status(500);
      res.json({ error: "Didn't work" });
    }

  }
}

async function getUsersPerformance(req, res) {
  if (!req.session || !req.session.ids || !req.query.userString) {
    res.json([]);
  } else {
    let result;
    const request = `query{searchUsers(name:"${req.query.userString}",limit:10){user{firstName,lastName,login}}}`;
    const query = `https://api.linkcs.fr/v1/graphql/?query=${encodeURIComponent(request)}`;
    console.log(query)
    await fetch(query, {
      method: 'GET',
      headers: {
        'Authorization': `Bearer ${req.session.ids.token.access_token}`
      }
    }).then(async (resp) => {
      if (resp.status != 200) {
        res.status(500);
        res.json({ error: "Didn't work" });
      } else {
        result = await resp.json();
      }
    }).catch(err => {
      res.status(500);
      res.send(err)
    })
    if (result) {
      console.log(result)
      return res.json(result.data.searchUsers.map(el => el.user))
    } else {
      res.status(500);
      res.json({ error: "Didn't work" });
    }

  }
}

function simple_query(query, args) {
  var connection = mysql.createConnection(dbConfig);
  connection.connect();
  return new Promise((resolve, reject) => {
    var sql = mysql.format(query, args);
    connection.query(sql, function (error, results) {
      if (error) {
        console.log('SQL ERROR')
        console.log(error)
        reject(error)
      }
      else {
        resolve(JSON.parse(JSON.stringify(results)))
      }
    });
    connection.end();
  })
}

async function isAdminMiddleware(req, res, next) {
  const login = req.session.ids.login || '';
  var query = "SELECT login FROM Admin WHERE deleted = 0;"

  const admins = await simple_query(query, []);
  const adminsList = admins.map((item) => item.login);

  if (adminsList.includes(login)) {
    return next();
  }
  res.status(403);
}

module.exports = { getAdministrateurs, addNewAdministrateur, updateAdministrateur, deleteAdministrateur, getAdminsLogins, getUsers, isAdminMiddleware }