(function() {

    var Api = function() {
        var handlers = {};
        var defaults = {
            baseUrl: "/api/",
            params: {"format": "json"},
            error: function(req) {
                //console.warn("Request Error:: " + req.status + ": " + req.statusText);
            },
            success: function(data) {
                //console.info("Success");
                //console.log(data);
            }
        };

        var methods  = {
            "create" : {
                "type": "POST",
                "uri": "url/shear",
                "params": ["url", "domain", "vanity"]
            },
            "detail" : {
                "type" : "GET",
                "uri"  : "url/get",
                "params" : ["mini", "domain", "account"]
            },
            "stats" : {
                "type" : "GET",
                "uri"  : "stats/{type}",
                "params" : ["mini", "type", "domain", "account", "segment", "interval", "start", "end", "limit", "offset"]
            }
        };

        var request = function(uri, params, type) {
            return function(data, success, error) {
                var re   = /\{([a-z]+)\}/gi;
                var base = uri; // copy the uri
                if (re.test(base)) {
                    base = base.replace(re, function() {
                        var p;
                        if (data && data[arguments[1]]) {
                            p = data[arguments[1]];
                            delete data[arguments[1]];
                        }
                        return p || '';
                    });
                }

                // TODO: add parameter validation.
                var url  = defaults.baseUrl + base;
                var data = $.extend({}, defaults.params, data);

                $.ajax({
                    url: url,
                    type: type,
                    data: data,
                    dataType: data.format,
                    success: success || defaults.success,
                    error: error || defaults.error
                });
            };
        };

        // attach the handlers
        var self = this;
        $.each(methods, function(i, v) {
            self[i] = request(this.uri, this.params, this.type);
        });
    };

    // create the ns and method.
    if (typeof woo == "undefined") {
        this.woo = {};
        this.woo.ly = woo.ly || {};
    }
    $.extend(woo.ly, {
        api: new Api()
    });

})();
