//
//
var SynkiURLSchema = {
	"workspace": 			["workspace"],
	"workspace_tag":	["workspace", "tag"],
	"watched_page":		["workspace", "watched_page"],
	"page": 					["workspace", "page"],
	"page_tag": 			["workspace", "page", "tag"],
	"attachment": 		["workspace", "page", ["attachment", "file_name"]],
	"revision": 			["workspace", "page", ["revision", "version"]],
	"tardis": 				["tardis"]
};

function DEFINE_SYNKI_PATH(name) {
	URLBuilder.prototype[name + "_path"] = function(obj, is_collection, action_name) {
		return this.makeup_path(name, obj, is_collection, action_name);
	}
};


//
//
var URLBuilder = function(protocol) {
	this.domain = BASE_DOMAIN // "synki.net"; // ToDo: should reference environment setting
	this.protocol = protocol || "http";
};

URLBuilder.prototype.compile = function(path, domain) {
	// var host = this._compileHost(domain);
	// return host + path;
	var path = this._compilePath(path);
	return path;
};

URLBuilder.prototype._compileHost = function(source) {
	if (!source) return "";

	var protocol = this.protocol + "://";
	var host = source[0] + "." + this.domain;

	return protocol + host;
};

URLBuilder.prototype._compilePath = function(source) {
	var path = source || [""];
	return "/" + path.join("/");
};

URLBuilder.prototype.pluralize = function(key) {
	var ptable = {
		"tardis": "tardis"
	};

	return ptable[key] || key+"s";
};

URLBuilder.prototype.arrangeHost = function(schema, obj) {
	return null;
};

URLBuilder.prototype.arrangePath = function(schema, obj, is_collection, action_name) {
	if (!schema) return [];
	
	var arranged = new Array;
	var is_collection = is_collection || false;

	var schema = schema.clone();
	var primary = schema.pop();

	// extract variables in order to compile path
	schema.each(function(k) {
		if (typeof(k)=="string") {
			var _key = k;
			var _attr = k + "_id";
		}
		else {
			var _key = k[0];
			var _attr = k[1];
		}
		arranged.push(this.pluralize(_key));
		var _value = obj[_attr] || "_error_";
		arranged.push(_value);
	}.bind(this));
	
	// extract primary variable
	if (typeof(primary)=="string") {
		var _key = primary;
		var _attr = primary + "_id";
	}
	else {
		var _key = primary[0];
		var _attr = primary[1];
	}
	arranged.push(this.pluralize(_key));
	if (!is_collection) {
		var _value = obj[_attr] || obj["id"] || "_error_";
		arranged.push(_value);
	}
	
	// extra action
	if (action_name) {
		arranged.push(action_name);
	}

	return arranged;
};

URLBuilder.prototype.makeup_path = function(schema_name, obj, is_collection, action_name) {
	// lookup schema
	var schema = SynkiURLSchema[schema_name];
	
	// arrange required variables
	var arranged_host = this.arrangeHost([], obj);
	var arranged_path = this.arrangePath(schema, obj, is_collection, action_name);
	
	// compile
	var url = this.compile(arranged_path, arranged_host);
	
	return url;
};

DEFINE_SYNKI_PATH("workspace");
DEFINE_SYNKI_PATH("workspace_tag");
DEFINE_SYNKI_PATH("watched_page");
DEFINE_SYNKI_PATH("page");
DEFINE_SYNKI_PATH("page_tag");
DEFINE_SYNKI_PATH("attachment");
DEFINE_SYNKI_PATH("revision");
DEFINE_SYNKI_PATH("tardis");

