// catproxy.js
// Caterpillar Proxy Integration for WelsonJS framework
// https://github.com/gnh1201/welsonjs
var JSONRPC2 = require("lib/jsonrpc2");

function CatProxyClient(url) {
    var env = {
        "target": "http://localhost:5555/jsonrpc2",    // Check this: https://github.com/gnh1201/caterpillar
        "method": ""
    };

    this.set_env = function(k, v) {
        env[k] = v || null;
    };
    this.set_default_env = function(_env) {
        for (k in _env) {
            if (!(k in env)) {
                env[k] = _env[k];
            }
        }
    };
    this.set_method = function(method) {
        this.set_env("method", method);

        if (env.method == "relay_mysql_query") {
            this.set_default_env({
                "mysql_hostname": "localhost",
                "mysql_username": "root",
                "mysql_password": null,
                "mysql_database": null,
                "mysql_port": "3306",
                "mysql_charset": "utf8"
            });
            return;
        }
    }
    this.exec = function(params) {
        var args = Array.from(arguments);
        var rpc = JSONRPC2.create(env.target);
        var result;

        if (env.method == "relay_mysql_query") {
            var query = args.join(' ');
            result = rpc.invoke(env.method, {
                "hostname": env.mysql_hostname,
                "username": env.mysql_username,
                "password": env.mysql_password,
                "database": env.mysql_database,
                "port": env.mysql_port,
                "charset": env.mysql_charset,
                "query": query
            }, null);
        } else {
            result = rpc.invoke(env.method, params, null);
        }

        return result;
    }

    if (typeof url !== "undefined") {
        this.set_env(url);
    }
}

function create(url) {
    return new CatProxyClient(url);
}

exports.create = create;
exports.CatProxyClient = CatProxyClient;

exports.VERSIONINFO = "Caterpillar Proxy Integration (caterpillar.js) version 0.1.5";
exports.AUTHOR = "abuse@catswords.net";
exports.global = global;
exports.require = global.require;