const path = require("path"),
fs = require("fs"),
WebSocket = require('ws'),
EventEmitter = require("events").EventEmitter

const events = new EventEmitter();

const constants = JSON.parse(fs.readFileSync(path.join(__dirname, "constants.json")))

var lastPong = 0

module.exports = {
    "lanyard": constants.fallbackLanyard,
    "connected": false,
    "lastLanyardUpdate": Date.now(),

    "blogConnected": false,
    "blogPosts": undefined,

    "events": events,

    "spins": 0,
}

function socketeer() {
    var lanyard = new WebSocket('https://api.violets-purgatory.dev')

    lanyard.on("error", (error) => {
        console.log(error)
    })

    lanyard.on("close", () => {
        console.log("Connection Closed. Attempting Reconnect in 30 seconds.")
        module.exports.lanyard = constants.fallbackLanyard
        module.exports.connected = false
        setTimeout(() => {
            socketeer()
        }, 30000);
    })

    function ping(dur) {
        lanyard.send(JSON.stringify({
            op: 3
        }))
        setTimeout(() => {
            ping(dur)
            if (Date.now() - lastPong > 120000) {
                lanyard.close()
                console.log("Max duration since last pong exceeded- Closing socket.")
            }
        }, dur);
    }

    lanyard.addEventListener("message", async (res) => {
        var data = JSON.parse(res.data)
        // console.log(data.op)
        if (data.op == 1) {
            console.log("Connected to Discord Websocket!")
            module.exports.connected = true
            ping(30000)
            lastPong = Date.now()
            events.emit("lanyardConnect")
        } else if (data.op == 3) {
            lastPong = Date.now()
        } else if (data.op == 0) {
            module.exports.lanyard = data.d
            module.exports.lastLanyardUpdate = Date.now()
            events.emit("lanyardUpdate")
        } else if (data.op == 4) {
            module.exports.spins = data.spins
        }
    })
}

socketeer()

function blogSocket() {
    var blog = new WebSocket('https://blog.violets-purgatory.dev')

    blog.on("error", (error) => {
        console.log(error)
    })

    blog.on("close", () => {
        console.log("Connection Closed. Attempting Reconnect in 30 seconds.")
        module.exports.blogConnected = false
        setTimeout(() => {
            blogSocket()
        }, 30000);
    })

    function ping(dur) {
        blog.send(JSON.stringify({
            type: "ping"
        }))
        setTimeout(() => {
            ping(dur)
            if (Date.now() - lastPong > 120000) {
                blog.close()
                console.log("Max duration since last pong exceeded- Closing socket.")
            }
        }, dur);
    }

    blog.addEventListener("message", async (res) => {
        var data = JSON.parse(res.data)
        if (data.type == "init") {
            console.log("Connected to Blog Websocket!")
            module.exports.blogConnected = true
            ping(30000)
            lastPong = Date.now()
            events.emit("blogConnect")
        } else if (data.type == "ping") {
            lastPong = Date.now()
        } else if (data.type == "allPosts") {
            console.log("Recieved posts!")
            module.exports.blogPosts = data.data
            events.emit("blogUpdate")
        } else {
            console.log(data)
        }
    })
}

blogSocket()