const jwt = require('jsonwebtoken');
const { getConnection, getUser } = require('./mysql');
const express = require('express');

async function checkAuth(req, res, next) {
    const { token } = req.body;
    if (!token) {
        return res.status(401).send({ error: 'No token provided' });
    }
    
    try {
        const decoded = jwt.verify(token, process.env.JWT_SECRET);
        const connection = await getConnection();
        const user = await getUser(connection, decoded.id);
        connection.end();
        if (!user[0]) {
            return res.status(401).send({ error: 'Invalid token' });
        }
        req.user = user[0];
        next();
    }
    catch (err) {
        return res.status(401).send({ error: 'Invalid token' });
    }
}

const router = express.Router();
const sockets = new Set();

router.ws('/', function(ws, req) {
    sockets.add(ws);

    ws.on('close', () => {
        sockets.delete(ws);
    });

    ws.on('message', (msg) => {
        const data = JSON.parse(msg);
        if (data.type === 'ping') {
            ws.send(JSON.stringify({ type: 'pong' }));
        }
    });
});

function socketsMiddleware(req, res, next) {
    req.sockets = {
        emit: function(data) {
            for (const socket of sockets) {
                socket.send(JSON.stringify(data));
            }
        }
    };
    next();
}

module.exports = {
    checkAuth,
    router,
    socketsMiddleware,
};