/**
 * @author jbell
 */
var nGen = function(){
	var bsgraGuid;
	var provisions = {};
	
	function getResource(provision, id, contentType, parameters, callback) {
		if (!bsgraGuid) {
			handleError("Attempted call to platform services without calling nGen.init() first!");
			return;
		}
		if (!contentType) {
			contentType = gadgets.io.ContentType.JSON;
		}
		var ioparams = {};
		ioparams[gadgets.io.RequestParameters.CONTENT_TYPE] = contentType;
		ioparams[gadgets.io.RequestParameters.HEADERS] = { BSGRA_GUID : bsgraGuid };
		
		var url = provisions[provision];
		if (!url) {
			handleError("Provision: " + provision + " not found!");
			return;
		}
		
		if (id) {
			url += "/" + id;
		}
		
		if (parameters) {
			var sepChar = "?";
			for (var i in parameters) {
				url += sepChar + i + "=" + parameters[i];
				sepChar = "&";
			}
		}
		
		gadgets.io.makeRequest(url, function(response) {
			processResponse(response, callback);
		}, ioparams);
	}
	
	function processResponse(response, callback) {
		if (response.errors && response.errors.length > 0) {
			for (var i in response.errors) {
				if (response.errors[i] && response.errors[i].length > 0) {
					handleError(response.errors[i]);
				}
			}
		}
		else {
			callback.call(this, response);
		}
	}
	
	function handleError(msg) {
		//TODO do some sort of real error handling
		//alert(msg);
	}
	
	return {
		init: function(pUrl, guid, startupCallback) {
			provisions.service_provision = pUrl;
			bsgraGuid = guid;
			nGen.provision.getProvisions(bsgraGuid, function(provs) {
				provisions = provs;
				startupCallback.call(this);
			});
		},
		provision: {
			getBsgraGuids: function(name, instance, callback) {
				getResource("service_provision_bsgra_guids", name, gadgets.io.ContentType.DOM, {instance: instance}, function (response) {
					var doc = response.data;
					var guidElem = doc.getElementsByTagName("bsgra_guid");
					if (guidElem.length > 0) {
						var guid = guidElem.item(0).firstChild.data;
						callback.call(this, guid);
					}
				});
			},
			getProvisions: function(guid, callback) {
				getResource("service_provision", guid, gadgets.io.ContentType.DOM, null, function (response) {
					var doc = response.data;
					var provs = {};
					var provList = doc.getElementsByTagName("provision");
					for (var i = 0; i < provList.length; i++) {
						var provision = provList.item(i);
					    var name = provision.getElementsByTagName("name").item(0).firstChild.data;
					    var endpointUri = provision.getElementsByTagName("endpoint_uri").item(0).firstChild.data;
						provs[name] = endpointUri;
					}
					callback.call(this, provs);
				});
			}
		},
		storage: function() {
			return {
				getResourceUrl: function(item) {
					if (!item.auth) {
						return provisions.service_storage_items + "/" + item.id;
					}
					else {
						return provisions.service_storageauth_items + "/" + item.id;
					}
				},
				directoryList: function(dirname, auth, callback){
					var encodedDir = Base64.encode(dirname);
					var provision = "service_storage_directories";
					if (auth) {
						provision = "service_storageauth_directories";
					}
					getResource(provision, encodedDir, gadgets.io.ContentType.DOM, null, function(response){
						var doc = response.data;
						var itemList = doc.getElementsByTagName("ITEM");
						var items = [];
						for (var i = 0; i < itemList.length; i++) {
							var itemElem = itemList.item(i);
							var item = {};
							var attrs = itemElem.attributes;
							for (var j = 0; j < attrs.length; j++) {
								var attr = attrs.item(j);
								item[attr.name] = attr.value;
							}
							item.auth = auth;
							var history = [];
							var versionList = itemElem.getElementsByTagName("VERSION");
							for (var k = 1; k < versionList.length; k++) {
								var versionElem = versionList[k];
								var version = {};
								version.name = versionElem.getAttribute("name");
								version.date = versionElem.firstChild.data;
								history.push(version);
							}
							item.history = history;
							items.push(item);
						}
						callback.call(this, items);
					});
				},
				getTicketUrl: function(url, callback) {
					var encodedUrl = Base64.encode(url);
					params = {request_url : encodedUrl};
					params[gadgets.io.RequestParameters.REFRESH_INTERVAL] = 1;
					getResource("service_storageauth_tickets", "service_storageauth_items", gadgets.io.ContentType.DOM, params, function(response){
						var doc = response.data;
						var ticketList = doc.getElementsByTagName("ticket-url");
						if (ticketList.length > 0) {
							callback.call(this, ticketList.item(0).firstChild.data);
						}
					});
				}
			};
		}()
	};
}();
