"use strict";

class Router {
    constructor() {
        this.staticRoutes = {};
        this.dynamicRoutes = {};
    }

    /* sets static routes to check for */
    addStaticRoute(route, callback) {
        this.staticRoutes[route] = callback;
    }

    /* sets dynamic routes to check for */
    addDynamicRoute(route, callback) {
        this.dynamicRoutes[route] = callback;
    }

    getResponse(req, body, sessionID) {
        let output = "";
        let url = req.url;
        let info = {};
    
        /* parse body */
        if (body !== "") {
            info = json.parse(body);
        }
    
        /* remove retry from URL */
        if (url.includes("?retry=")) {
            url = url.split("?retry=")[0];
        }
        
        /* route request */
        if (url in this.staticRoutes) {
            output = this.staticRoutes[url](url, info, sessionID);
        } else {
            for (let key in this.dynamicRoutes) {
                if (url.includes(key)) {
                    output = this.dynamicRoutes[key](url, info, sessionID);
                }
            }
        }
    
        /* load files from game cache */
        if ("crc" in info) {
            let crctest = json.parse(output);

            if ("crc" in crctest && info.crc === crctest.crc) {
                logger.logWarning("[CRC match]: loading from game cache files");
                output = '{"err":0, "errmsg":null, "data":null}';
            }
        }

        /* route doesn't exist or response is not properly set up */
        if (output === "") {
            logger.logError("[UNHANDLED][" + url + "] request data: " + json.stringify(info));
            output = '{"err":404, "errmsg":"UNHANDLED RESPONSE: ' + url + '", "data":null}';
        }
    
        return output;
    }
}

module.exports.router = new Router();