const bds = require("../index")
const { CheckBan } = require("./check");
const { GetPlatform, GetPaths } = require("../lib/BdsSettings");
const fs = require("fs");

function MytypeKill(player) {
    console.warn(`Player ${player} tried to connect to the server`)
    let removeUser = `tp "${player}" ~ 128 ~`
    console.log(removeUser);
    var RemoveUser = setInterval(() => {
        bds.command(removeUser);
        bds_server_string.stdout.on("data", (data) => {
            if (data.includes("disconnected:")) {
                if (data.includes(player)) clearInterval(RemoveUser);
            }
        })
        
    }, 6 * 1000);
    return RemoveUser;
}

function Bedrock(data){
    const file_users = fs.readFileSync(GetPaths("player"), "utf8");
    const users = JSON.parse(file_users);
    const CurrentData = new Date();
    for (let line of data.split(/\r?\n/g)) {
        if (line.includes("connected:")) {
            line = line.replace("[INFO] Player ", "").trim()
            let GetSatatus = line.trim().split(/\s+/g)[0];
            const GetUser = [];
            for (let index of line.trim().replace("connected:", "").replace("dis", "").trim().split(", xuid:")) if (index !== "") GetUser.push(index.trim());
            // -------------------------------------------------
            var username = GetUser[0];
            console.log(GetUser);
            // User Connected
            if (GetSatatus === "connected:") {
                if (CheckBan(username)) MytypeKill(username)
                else if (users.bedrock[username] === undefined) {
                    var xuid = GetUser[1];
                    users.bedrock[username] = {
                        date: CurrentData,
                        connected: true,
                        xboxID: xuid,
                        update: [
                            {
                                date: CurrentData,
                                connected: true,
                            }
                        ]
                    }
                } else {
                    users.bedrock[username].connected = true
                    users.bedrock[username].date = CurrentData
                    users.bedrock[username].update.push({
                        date: CurrentData,
                        connected: true,
                    })
                }
            }
            // User Disconnected
            else if (GetSatatus === "disconnected:") {
                if (!(CheckBan(username))){
                    users.bedrock[username].connected = false
                    users.bedrock[username].date = CurrentData
                    users.bedrock[username].update.push({
                        date: CurrentData,
                        connected: false,
                    })
                }
            }
        }
    }
    fs.writeFileSync(GetPaths("player"), JSON.stringify(users, null, 2))
    if (users.bedrock[username]) return true
    else return false
}

function Pocketmine(data){
    const UTF8Users = fs.readFileSync(GetPaths("player"), "utf8");
    const users = JSON.parse(UTF8Users);
    const CurrentData = new Date();

    // Init
    for (let line of data.split(/\r?\n/g)) {
        line = line.replace(/\[[0-9][0-9]:[0-9][0-9]:[0-9][0-9]\] \[Server thread\/INFO\]: /, "").trim();
        const currenttosave = {
            username: line.replace("joined the game", "").replace("left the game", "").trim(),
            join: line.includes("joined"),
            left: line.includes("left")
        }
        if (currenttosave.join){
            const username = currenttosave.username;
            if (users.pocketmine[username]) {
                users.pocketmine[username].connected = true
                users.pocketmine[username].date = CurrentData
                users.pocketmine[username].update.push({
                    date: CurrentData,
                    connected: true,
                })
            } else {
                users.pocketmine[username] = {
                    connected: true,
                    date: CurrentData,
                    update: [
                        {
                            date: CurrentData,
                            connected: true,
                        }
                    ]
                }
            }
        }
        else if (currenttosave.left){
            const username = currenttosave.username;
            if (users.pocketmine[username]) {
                users.pocketmine[username].connected = false
                users.pocketmine[username].date = CurrentData
                users.pocketmine[username].update.push({
                    date: CurrentData,
                    connected: false,
                })
            }
        }
    }
    fs.writeFileSync(GetPaths("player"), JSON.stringify(users, null, 2))
    return users
}

function java(data){
    const UTF8Users = fs.readFileSync(GetPaths("player"), "utf8");
    const users = JSON.parse(UTF8Users);
    const CurrentData = new Date();

    // Init
    for (let line of data.split(/\r?\n/g)) {
        line = line.replace(/\[[0-9][0-9]:[0-9][0-9]:[0-9][0-9]\] \[Server thread\/INFO\]:/, "").trim();
        const currenttosave = {
            username: line.replace("joined the game", "").replace("left the game", "").trim(),
            join: line.includes("joined the"),
            left: line.includes("left the")
        }
        if (currenttosave.join){
            const username = currenttosave.username;
            if (users.java[username]) {
                users.java[username].connected = true
                users.java[username].date = CurrentData
                users.java[username].update.push({
                    date: CurrentData,
                    connected: true,
                })
            } else {
                users.java[username] = {
                    connected: true,
                    date: CurrentData,
                    update: [
                        {
                            date: CurrentData,
                            connected: true,
                        }
                    ]
                }
            }
        }
        else if (currenttosave.left){
            const username = currenttosave.username;
            if (users.java[username]) {
                users.java[username].connected = false
                users.java[username].date = CurrentData
                users.java[username].update.push({
                    date: CurrentData,
                    connected: false,
                })
            }
        }
    }
    fs.writeFileSync(GetPaths("player"), JSON.stringify(users, null, 2))
    return users
}

module.exports = function (data){
    if (GetPlatform() === "bedrock") return Bedrock(data);
    else if (GetPlatform() === "java") return java(data);
    else if (GetPlatform() === "pocketmine") return Pocketmine(data);
    else if (GetPlatform() === "jsprismarine") return false
    else throw new Error("Plafotform Error !!")
};