package com.winsun.tenpay;

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.util.SortedMap;
import java.util.TreeMap;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.winsun.tenpay.util.MD5Util;
import com.winsun.tenpay.util.TenpayUtil;

public class NewIntfRequestHandler {
	private String gateUrl;
	private String key;
	private SortedMap parameters;
	private String debugInfo;
	protected HttpServletRequest request;
	protected HttpServletResponse response;

	public NewIntfRequestHandler(HttpServletRequest request, HttpServletResponse response) {
		this.request = request;
		this.response = response;

		// this.gateUrl = "https://gw.tenpay.com/gateway/pay.htm";
		this.gateUrl = " https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers";
		this.key = "";
		this.parameters = new TreeMap();
		this.debugInfo = "";
	}

	public void init() {
	}

	public String getGateUrl() {
		return this.gateUrl;
	}

	public void setGateUrl(String gateUrl) {
		this.gateUrl = gateUrl;
	}

	public String getKey() {
		return this.key;
	}

	public void setKey(String key) {
		this.key = key;
	}

	public String getParameter(String parameter) {
		String s = (String) this.parameters.get(parameter);
		return s == null ? "" : s;
	}

	public void setParameter(String parameter, String parameterValue) {
		String v = "";
		if (parameterValue != null) {
			v = parameterValue.trim();
		}
		this.parameters.put(parameter, v);
	}

	public SortedMap getAllParameters() {
		return this.parameters;
	}

	public String getDebugInfo() {
		return this.debugInfo;
	}

	public String getRequestURL() throws UnsupportedEncodingException {
		createSign();

		StringBuffer sb = new StringBuffer();
		String enc = TenpayUtil.getCharacterEncoding(this.request, this.response);
		Set es = this.parameters.entrySet();
		Iterator it = es.iterator();
		while (it.hasNext()) {
			Map.Entry entry = (Map.Entry) it.next();
			String k = (String) entry.getKey();
			String v = (String) entry.getValue();
			if (!"spbill_create_ip".equals(k)) {
				sb.append(k + "=" + URLEncoder.encode(v, enc) + "&");
			} else {
				sb.append(k + "=" + v.replace("\\.", "%2E") + "&");
			}
		}
		String reqPars = sb.substring(0, sb.lastIndexOf("&"));

		return getGateUrl() + "?" + reqPars;
	}

	public void doSend() throws UnsupportedEncodingException, IOException {
		this.response.sendRedirect(getRequestURL());
	}

	protected void createSign() {
		StringBuffer sb = new StringBuffer();
		Set es = this.parameters.entrySet();
		Iterator it = es.iterator();
		while (it.hasNext()) {
			Map.Entry entry = (Map.Entry) it.next();
			String k = (String) entry.getKey();
			String v = (String) entry.getValue();
			if ((v != null) && (!"".equals(v)) && (!"sign".equals(k)) && (!"key".equals(k))) {
				sb.append(k + "=" + v + "&");
			}
		}

		sb.append("key=" + getKey());

		String sign = MD5Util.MD5Encode(sb.toString(), "UTF-8").toUpperCase();

		setParameter("sign", sign);
		setDebugInfo(sb.toString() + " => sign:" + sign);
	}

	protected void setDebugInfo(String debugInfo) {
		this.debugInfo = debugInfo;
	}

	protected HttpServletRequest getHttpServletRequest() {
		return this.request;
	}

	protected HttpServletResponse getHttpServletResponse() {
		return this.response;
	}
}
