const { __glob } = require("./global-variables")
const { LogType } = require("loguix")
const fs = require("fs")
const discord = require("./discord-bot")

const nlog = new LogType("Node-Finder")

const nodesState = new Map()

/// <reference path="./types.d.ts" />

function checkAndCreate() {
    if (!fs.existsSync(__glob.NODES)) {
        try {
            var nodes = {}
            saveNodesFile(nodes) 
            nlog.log("Création d'un fichier de base de donnée de nodes ! Redémarrage de l'application nécéssaire !")
            nlog.step.error("find_nodes", "Redémarrage requis pour lire la nouvelle base de donnée des nodes !")
            process.exit(0)
        } catch (error) {
            nlog.step.error("find_nodes", "Tentative de création du fichier de base de donnée nodes échoué !" + error)
        }
    }
}

function readNodesFile() {
    checkAndCreate()
    return JSON.parse(fs.readFileSync(__glob.NODES))
}

function saveNodesFile(data) { 
    fs.writeFileSync(__glob.NODES, JSON.stringify(data, null, 2))
}

module.exports.reloadNode = function (data) {
    const client = discord.getClient()
   
    if (client.manager) {
        const nodesPresent = client.manager.nodes
        if (nodesPresent.get(data.host)) {
            client.manager.nodes.remove(data.host)
        }
        nlog.log("Redémarrage de la node : " + data.host)
        client.manager.nodes.add(data)
        client.manager.nodes.get(data.host).connect()
      
    }
}

module.exports.setNodeState = function (node, state) {
    nodesState.set(node, state)
    process.emit("UPDATE_NODES")
}

module.exports.getNodesStates = function () {
    return nodesState
}

module.exports.getNodes = function () {

    nlog.step.init("find_nodes", "Récupération des nodes de la base de donnée")
    try {
        var nodes_data = readNodesFile()
        const nodes_array = new Array()
        for (var node of nodes_data) {
            nodes_array.push(node)
            nodesState.set(node.host, false)
        }
        nlog.log("Récupération de " + nodes_array.length + " nodes dans la base de donnée !")
        nlog.step.end("find_nodes")
        return nodes_array
    } catch (error) {
        nlog.step.error("find_nodes", error)
    }
}

module.exports.getNodesData = function () {
    nlog.step.init("findu_nodes", "Récupération des nodes pour envoi d'informations!")
    try {
        var nodes_data = readNodesFile()
        const nodes_array = new Array()
        for (var node of nodes_data) {
            node.state = nodesState.get(node.host)
            nodes_array.push(node)
        }
        nlog.log("Récupération de " + nodes_array.length + " nodes pour envoi d'informations!")
        nlog.step.end("findu_nodes")
        return nodes_array
    } catch (error) {
        nlog.step.error("findu_nodes", error)
    }
}

module.exports.addNodes = function (data) {
    nlog.step.init("add_nodes", "Ajout d'un nouveau noeud dans la base de donnée de nodes : " + data.host)
    try {
        var nodes_data = readNodesFile()
        data.retryAmount = 5
        nodes_data.push(data)
        saveNodesFile(nodes_data) 
        nlog.step.end("add_nodes")
        const client = discord.getClient()
        if (client.manager) {
            const nodesPresent = client.manager.nodes
            if (!nodesPresent.get(data.host)) {
                client.manager.nodes.add(data)
            }
            client.manager.nodes.get(data.host).connect()
        }
    } catch (error) {
        nlog.step.error("add_nodes", error)
    }
}



module.exports.deleteNode = function (data) {
    nlog.step.init("deleteNodes", "Supression d'un noeud dans la base de donnée de nodes : " + data.host)
    try {
        var nodes_data = readNodesFile()
        var nodeIndex = -1
        for (var node of nodes_data) {
            if (node.host == data.host) {
                nodeIndex = nodes_data.indexOf(node)
            }
        }
        nodes_data.splice(nodeIndex, 1)
        const client = discord.getClient()
        if (client.manager) {
            const nodesPresent = client.manager.nodes
            if (nodesPresent.get(data.host)) {
                client.manager.nodes.remove(data.host)
            }
        }
        saveNodesFile(nodes_data) 
        nlog.step.end("deleteNodes")
    } catch (error) {
        nlog.step.error("deleteNodes", error)
    }
}
