/**
 * The class of generating links to images by the schema and its parameters.
 * The type of the schema is indicated by the system setting Terrasoft.core.enums.ImageSources
 */
Ext.define("Terrasoft.utils.common.ImageUrlBuilder", {

	alternateClassName: "Terrasoft.ImageUrlBuilder",

	/**
  * The schema matching object to the parameters for building the image reference.
  * The object key is the schema type. The key in the object itself is the URL parameter of the link,
  * and the value for this key is a parameter from the incoming data config
  * If the inbound settings:
  * {
  * source: Terrasoft.core.enums.ImageSources.ENTITY_COLUMN,
  * db: 'p_db',
  * schemaName: 'p_schemaName',
  * primaryColumnValue: 'p_primaryColumnValue',
  * columnName: 'p_columnName'
  *}
  * The resultant reference is obtained, approximately, of the form
  * <base_url> / img / entity / p_schemaName / p_columnName / p_primaryColumnValue
  * @protected
  */
	statics: {
		/**
   * Diagram of the correspondence of the types of schemas to the image address parameters
   * @protected
   */
		urlParamsMap: function () {
			var urlParamsMap = {};
			// TODO #191202 NUI: imageUrlBuilder. Переделать формирование конфигов

			// images taking into account the new routing in global.asax

			// Rename the "s" parameter to new mappings

			// db -> entity
			// shm -> image-list
			// res -> resource-manager
			// scs -> source-code
			// puts -> process-usertask
			urlParamsMap[Terrasoft.ImageSources.ENTITY_COLUMN] = {
				s: "db",
				sn: "schemaName",
				scn: "columnName",
				id: "primaryColumnValue"
			};
			urlParamsMap[Terrasoft.ImageSources.IMAGE_LIST_SCHEMA] = {
				s: "shm",
				sid: "schemaUId",
				r: "itemUId"
			};
			urlParamsMap[Terrasoft.ImageSources.RESOURCE_MANAGER] = {
				s: "res",
				rm: "resourceManagerName",
				r: "resourceItemName"
			};
			urlParamsMap[Terrasoft.ImageSources.SOURCE_CODE_SCHEMA] = {
				s: "scs",
				sn: "schemaName",
				r: "resourceItemName"
			};
			urlParamsMap[Terrasoft.ImageSources.SYS_SETTING] = {
				sf: "terrasoft.axd",
				s: "nui-binary-syssetting",
				r: "resourceItemName"
			};
			urlParamsMap[Terrasoft.ImageSources.URL] = function (config) {
				return config.url;
			};
			urlParamsMap[Terrasoft.ImageSources.PROCESS_USERTASK_SCHEMA] = {
				s: "puts",
				sn: "schemaName",
				r: "resourceItemName"
			};
			return urlParamsMap;
		}(),

		_isStaticContentImageConfig: function (config) {
			if (!Terrasoft.useStaticFileContent) {
				return false;
			}
			var params = config.params;
			if (params && params.resourceItemExtension) {
				return true;
			}
			var message = Ext.String.format("Image config for item \"{1}\" in schema \"{0}\" " + "doesn't have property \"resourceItemExtension\". " + "It is an obsolete logic and will be removed in future versions.", params.schemaName, params.resourceItemName);
			console.warn(message);
			return false;
		},

		_getUrlForStaticContentImage: function (config) {
			var urlParts = [];
			urlParts.push(Terrasoft.workspaceBaseUrl);
			urlParts.push(Terrasoft.app.config.staticFileContent.imagesRuntimePath);
			var fileName = config.params.schemaName + "-" + config.params.resourceItemName + config.params.resourceItemExtension;
			urlParts.push(fileName);
			var hashParameter = config.params.hash ? "?hash=" + config.params.hash : Terrasoft.emptyString;
			return urlParts.join("/") + hashParameter;
		},

		/**
   * Method for converting a schema into an image URL
   * @param {Object} config
   * @return {String}
   */
		getUrl: function (config) {
			var source = config.source;
			var urlParamsMap = this.urlParamsMap[source];
			if (Ext.isFunction(urlParamsMap)) {
				return urlParamsMap(config);
			}
			var urlParamsData = config.params;
			if (config.hash) {
				urlParamsData.hash = config.hash;
			}
			urlParamsData.hash = urlParamsData.hash || "hash";
			var paramsList = [];
			var baseUrl = Terrasoft.workspaceBaseUrl + "/img";
			paramsList.push(baseUrl);
			switch (source) {
				case Terrasoft.core.enums.ImageSources.ENTITY_COLUMN:
					paramsList.push("entity");
					paramsList.push(urlParamsData.hash);
					paramsList.push(urlParamsData.schemaName);
					paramsList.push(urlParamsData.columnName);
					paramsList.push(urlParamsData.primaryColumnValue);
					break;
				case Terrasoft.core.enums.ImageSources.IMAGE_LIST_SCHEMA:
					paramsList.push("image-list");
					paramsList.push(urlParamsData.hash);
					paramsList.push(urlParamsData.schemaUId);
					paramsList.push(urlParamsData.itemUId);
					break;
				case Terrasoft.core.enums.ImageSources.RESOURCE_MANAGER:
					paramsList.push("resource-manager");
					paramsList.push(urlParamsData.hash);
					paramsList.push(urlParamsData.resourceManagerName);
					paramsList.push(urlParamsData.resourceItemName);
					break;
				case Terrasoft.core.enums.ImageSources.SOURCE_CODE_SCHEMA:
					if (this._isStaticContentImageConfig(config)) {
						return this._getUrlForStaticContentImage(config);
					}
					paramsList.push("source-code");
					paramsList.push(urlParamsData.hash);
					paramsList.push(urlParamsData.schemaName);
					paramsList.push(urlParamsData.resourceItemName);
					break;
				case Terrasoft.core.enums.ImageSources.PROCESS_USERTASK_SCHEMA:
					paramsList.push("process-usertask");
					paramsList.push(urlParamsData.hash);
					paramsList.push(urlParamsData.schemaName);
					paramsList.push(urlParamsData.resourceItemName);
					break;
				case Terrasoft.core.enums.ImageSources.SYS_SETTING:
					var url = [];
					var settingsCode = urlParamsData.r;
					var sourceHash = null;
					if (typeof settingsCode !== "undefined" && settingsCode !== "") {
						if (Terrasoft.hasOwnProperty("SysSettingsImageHash")) {
							sourceHash = Terrasoft.SysSettingsImageHash[settingsCode];
						}
					}
					var stringParams = [];
					for (var urlParamsMapKey in urlParamsMap) {
						if (urlParamsMapKey === "sf") {
							if (urlParamsMapKey in urlParamsData) {
								url.push(urlParamsData[urlParamsMapKey] + "?");
							} else {
								url.push(urlParamsMap[urlParamsMapKey] + "?");
							}
						} else {
							if (urlParamsMapKey in urlParamsData) {
								stringParams.push(urlParamsMapKey + "=" + urlParamsData[urlParamsMapKey]);
							} else {
								stringParams.push(urlParamsMapKey + "=" + urlParamsMap[urlParamsMapKey]);
							}
						}
					}
					if (sourceHash !== null) {
						stringParams.push("source_hash=" + sourceHash);
					}
					url.push(stringParams.join("&"));
					paramsList.push(url.join(""));
					break;
				case Terrasoft.core.enums.ImageSources.SYS_IMAGE:
					paramsList.push("entity", urlParamsData.hash, "SysImage", "Data");
					paramsList.push(urlParamsData.primaryColumnValue);
					break;
				default:
					break;
			}
			return paramsList.join("/");
		}
	}
});