const { LogType } = require("loguix")
const fs = require("fs")
const path = require("path")
const { __glob } = require("./global-variables")
const alog = new LogType("Authentification")
const keygen = require("./keygen")
const users = require("./users")

/**
 * Vérifie si le token est présent et appartient à un utilisateur
 * @param {string} token 
 */

module.exports.check = function(token) {
    var isApproved = false;
    var username = null
    users.getUsers().forEach((fetchUser) => {
        if(fetchUser.tokens.includes(token)) {
            isApproved = true
            username = fetchUser.username
        }

    })

    if(isApproved) {
        return true
    } else {
        if(token) {

            alog.warn("Erreur d'authentification - Token n'existe pas : " + token)
        }
        return false
    }
} 

/**
 * Permet de se connecter à Neutral
 * @param {object} data 
 * @returns Token or AUTH_FAILED
 */
module.exports.login = function(data) {
    var username = data.username
    var password = data.password

    if(users.getUsers().has(username)) {
        const user = users.getUsers().get(username)
        if(password == user.getPassword()) {
            const token = user.generateToken()
            alog.log("Connexion approuvé de l'utilisateur : " + username)
            return token
        } else {
            alog.warn("Echec de connexion de l'utilisateur : " + username + " - Mot de passe incorrect")
            return "AUTH_FAILED"
        }

    } else {
        alog.warn("Echec de connexion de l'utilisateur : " + username + " - Utilisateur non-inscrit dans la base de donnée")
        return "AUTH_FAILED"
    }
}   

/**
 * Remove the token
 * @param {string} token 
 * @returns 
 */
module.exports.signout = function(token) {
    var isDone = false;
    var username = null
    users.getUsers().forEach((fetchUser) => {
        if(fetchUser.tokens.includes(token)) {
            isDone = true
            username = fetchUser.username
            fetchUser.removeToken(token)
        }

    })

    if(isDone) {
        alog.log("Suppression du Token '"  + token + "' de l'utilisateur : " + username)
        return true
    } else {
        if(token) {

            alog.warn("Erreur d'opération lors de la déconnexion - Token n'existe pas : " + token)
        }
        return false
    }

}

module.exports.getUserByToken = function(token) {
    var isApproved = false;
    var userGetted = null
    users.getUsers().forEach((fetchUser) => {
        if(fetchUser.tokens.includes(token)) {
            userGetted = fetchUser
        }

    })

    if(userGetted) {
        return userGetted

    } else {
        if(token) {

            alog.warn("Erreur d'authentification - Token n'existe pas : " + token)
        }
        return false
    }

}