package nc.pub.framework.client.dispatch;

import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;

import nc.bs.framework.common.InvocationInfoProxy;
import nc.vo.jcom.lang.StringUtil;

public class ClientDispatchCfg implements Serializable {

	public static final String TYPE_URL = "url";
	public static final String TYPE_URI = "uri";

	private static final long serialVersionUID = 1L;
	private String type = "";
	// /////////////////////service+busiAction////////////////////////
	/* source service - url 原始规则 */
	private Map<String, String> serviceRuleUrl = new HashMap<String, String>();
	// ///////////////////user////////////////////////
	// user -> url
	private Map<String, String> userUrlMap = new HashMap<String, String>();

	/* service+busiAction - url && user-url */
	private Map<String, String> serviceUrlMap = new HashMap<String, String>();

	/* groupName - serverName[] 该map提供给LMC，仅用做页面显示 */
	private Map<String, String[]> sgServer = new HashMap<String, String[]>();

	public String getType() {
		return type;
	}

	public void setType(String type) {
		this.type = type;
	}

	public Map<String, String> getUserUrlMap() {
		return userUrlMap;
	}

	public void setUserUrlMap(Map<String, String> userUrlMap) {
		this.userUrlMap = userUrlMap;
	}

	public Map<String, String> getServiceRuleUrl() {
		return serviceRuleUrl;
	}

	public void setServiceRuleUrl(Map<String, String> serviceUrl) {
		this.serviceRuleUrl = serviceUrl;
	}

	public String getURIGroup(String busiAction, String serviceName) {
		if (TYPE_URI.equalsIgnoreCase(type)) {
			return getPath(busiAction, serviceName);
		}
		return "";
	}

	public String getURL(String busiAction, String serviceName) {
		if (TYPE_URL.equalsIgnoreCase(type)) {
			return getPath(busiAction, serviceName);
		}
		return "";
	}

	/**
	 * 规则 ： 1）busiAction + serviceName 2）serviceName 3）busiAction
	 * 
	 * @param busiAction
	 * @param serviceName
	 * @return
	 */
	private String getPath(String busiAction, String serviceName) {
		String skey = ClientDispatchCommon.getKeyByServicenameAndBusiaction(busiAction, serviceName);
		if (!serviceUrlMap.containsKey(skey)) {
			String resultUrl = fixUrl(busiAction, serviceName);
			if (StringUtil.isEmptyWithTrim(resultUrl)) {
				resultUrl = fixUrl("", serviceName);
			}
			if (StringUtil.isEmptyWithTrim(resultUrl)) {
				resultUrl = fixUrl(busiAction, "");
			}

			// user
			if (StringUtil.isEmptyWithTrim(resultUrl)) {
				resultUrl = userUrlMap.get(InvocationInfoProxy.getInstance().getUserId());
			}
			serviceUrlMap.put(skey, resultUrl);
		}
		return serviceUrlMap.get(skey);

	}

	private String fixUrl(String busiAction, String serviceName) {
		String resultUrl = "";
		String skey = ClientDispatchCommon.getKeyByServicenameAndBusiaction(busiAction, serviceName);
		resultUrl = serviceRuleUrl.get(skey);
		if (StringUtil.isEmptyWithTrim(resultUrl) && !StringUtil.isEmptyWithTrim(serviceName)) {
			Set<String> keys = serviceRuleUrl.keySet();
			for (String key : keys) {
				if (key.endsWith(".*")) {// busiaction###nc.pub.*
					String curService = "";
					String curBusiAction = "";
					if (key.contains(ClientDispatchCommon.TAG)) {
						String[] tags = key.split(ClientDispatchCommon.TAG);
						curBusiAction = StringUtil.isEmptyWithTrim(tags[0]) ? "" : tags[0];
						curService = tags[1];
					} else {
						curBusiAction = "";
						curService = key;
					}

					if (curBusiAction.equalsIgnoreCase(busiAction) && serviceName.startsWith(curService.substring(0, curService.length() - 1))) {
						resultUrl = serviceRuleUrl.get(key);
						break;
					}
				}
			}
		}
		return resultUrl;
	}

	public Map<String, String[]> getSgServer() {
		return sgServer;
	}

	public void setSgServer(Map<String, String[]> sgServer) {
		this.sgServer = sgServer;
	}
}
