package com.github.misterchangray.libs.okcoin.rest.stock.impl;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

import com.github.misterchangray.common.utils.CryptoUtils;
import com.github.misterchangray.common.utils.StringSort;
import com.github.misterchangray.libs.okcoin.rest.HttpUtilManager;
import com.github.misterchangray.libs.okcoin.rest.MD5Util;
import com.github.misterchangray.libs.okcoin.rest.StringUtil;
import com.github.misterchangray.libs.okcoin.rest.stock.IStockRestApi;
import org.apache.http.HttpException;





public class StockRestApi implements IStockRestApi {

	private String secret_key;
	
	private String api_key;
	
	private String url_prex;
	
	public StockRestApi(String url_prex,String api_key,String secret_key){
		this.api_key = api_key;
		this.secret_key = secret_key;
		this.url_prex = url_prex;
	}
	
	public StockRestApi(String url_prex){
		this.url_prex = url_prex;
	}


	
	/**
	 * 现货行情URL
	 */
	private final String TICKER_URL = "/api/v1/ticker.do?";
	
	/**
	 * 现货市场深度URL
	 */
	private final String DEPTH_URL = "/api/v1/depthSpot.do?";
	
	/**
	 * 现货历史交易信息URL
	 */
	private final String TRADES_URL = "/api/v1/trades.do?";
	
	/**
	 * 现货获取用户信息URL
	 */
	private final String USERINFO_URL = "/api/v1/userinfo.do?";
	
	/**
	 * 现货 下单交易URL
	 */
	private final String TRADE_URL = "/api/v1/order.do?";
	
	/**
	 * 现货 批量下单URL
	 */
	private final String BATCH_TRADE_URL = "/api/v1/batch_trade.do";
	
	/**
	 * 现货 撤销订单URL
	 */
	private final String CANCEL_ORDER_URL = "/api/v1/cancel_order.do";
	
	/**
	 * 现货 获取用户订单URL
	 */
	private final String ORDER_INFO_URL = "/api/v1/order_info.do";
	
	/**
	 * 现货 批量获取用户订单URL
	 */
	private final String ORDERS_INFO_URL = "/api/v1/orders_info.do";
	
	/**
	 * 现货 获取历史订单信息,只返回最近七天的信息URL
	 */
	private final String ORDER_HISTORY_URL = "/api/v1/order_history.do";

	@Override
	public String ticker(String symbol) throws HttpException, IOException {
		HttpUtilManager httpUtil = HttpUtilManager.getInstance();
		String param = "";
//		if(!StringUtil.isEmpty(symbol )) {
//			if (!param.equals("")) {
//				param += "&";
//			}
//			param += "symbol=" + symbol;
//		}
		String[] params = {"secret_key=" + secret_key,"symbol=" + symbol, "api_key=" + api_key};
		params = StringSort.getUrlParam(params);
		param = StringSort.getText(params, "&");
		param = param + "&sign=" + CryptoUtils.encodeMD5(param);

		String result = httpUtil.requestHttpGet(url_prex, TICKER_URL, param);
	    return result;
	}

	@Override
	public String depth(String symbol) throws HttpException, IOException {
		HttpUtilManager httpUtil = HttpUtilManager.getInstance();
		String param = "";
		if(!StringUtil.isEmpty(symbol )) {
			if(!param.equals("")) {
				param += "&";
			}
			param += "symbol=" + symbol;
		}
		String result = httpUtil.requestHttpGet(url_prex, this.DEPTH_URL, param);
	    return result;
	}

	@Override
	public String trades(String symbol, String since) throws HttpException, IOException {
		HttpUtilManager httpUtil = HttpUtilManager.getInstance();
		String param = "";
		if(!StringUtil.isEmpty(symbol )) {
			if (!param.equals("")) {
				param += "&";
			}
			param += "symbol=" + symbol;
		}
		if(!StringUtil.isEmpty(since )) {
			if (!param.equals("")) {
				param += "&";
			}
			param += "since=" + since;
		}
		String result = httpUtil.requestHttpGet(url_prex, this.TRADES_URL, param);
	    return result;
	}

	@Override
	public String userinfo() throws HttpException, IOException {
		// 构造参数签名
		Map<String, String> params = new HashMap<String, String>();
		params.put("api_key", api_key);
		String sign = MD5Util.buildMysignV1(params, this.secret_key);
		params.put("sign", sign);
		
		// 发送post请求
		HttpUtilManager httpUtil = HttpUtilManager.getInstance();
		String result = httpUtil.requestHttpPost(url_prex,this.USERINFO_URL,
				params);

		return result;
	}

	@Override
	public String trade(String symbol, String type,
			String price, String amount) throws HttpException, IOException {
		// 构造参数签名
		Map<String, String> params = new HashMap<String, String>();
		params.put("api_key", api_key);
		if(!StringUtil.isEmpty(symbol)){
			params.put("symbol", symbol);
		}
		if(!StringUtil.isEmpty(type)){
			params.put("type", type);
		}
		if(!StringUtil.isEmpty(price)){
			params.put("price", price);
		}
		if(!StringUtil.isEmpty(amount)){
			params.put("amount", amount);
		}
		String sign = MD5Util.buildMysignV1(params, this.secret_key);
		params.put("sign", sign);
		
		// 发送post请求
		HttpUtilManager httpUtil = HttpUtilManager.getInstance();
		String result = httpUtil.requestHttpPost(url_prex,this.TRADE_URL,
				params);

		return result;
	}

	@Override
	public String batch_trade( String symbol, String type,
			String orders_data) throws HttpException, IOException {
		// 构造参数签名
		Map<String, String> params = new HashMap<String, String>();
		params.put("api_key", api_key);
		if(!StringUtil.isEmpty(symbol)){
			params.put("symbol", symbol);
		}
		if(!StringUtil.isEmpty(type)){
			params.put("type", type);
		}
		if(!StringUtil.isEmpty(orders_data)){
			params.put("orders_data", orders_data);
		}
		String sign = MD5Util.buildMysignV1(params, this.secret_key);
		params.put("sign", sign);
		
		// 发送post请求
		HttpUtilManager httpUtil = HttpUtilManager.getInstance();
		String result = httpUtil.requestHttpPost(url_prex,this.BATCH_TRADE_URL,
				params);

		return result;
	}

	@Override
	public String cancel_order(String symbol, String order_id) throws HttpException, IOException {
		// 构造参数签名
		Map<String, String> params = new HashMap<String, String>();
		params.put("api_key", api_key);
		if(!StringUtil.isEmpty(symbol)){
			params.put("symbol", symbol);
		}
		if(!StringUtil.isEmpty(order_id)){
			params.put("order_id", order_id);
		}

		String sign = MD5Util.buildMysignV1(params, this.secret_key);
		params.put("sign", sign);
		
		// 发送post请求
		HttpUtilManager httpUtil = HttpUtilManager.getInstance();
		String result = httpUtil.requestHttpPost(url_prex,this.CANCEL_ORDER_URL,
				params);

		return result;
	}

	@Override
	public String order_info(String symbol, String order_id) throws HttpException, IOException {
		// 构造参数签名
		Map<String, String> params = new HashMap<String, String>();
		params.put("api_key", api_key);
		if(!StringUtil.isEmpty(symbol)){
			params.put("symbol", symbol);
		}
		if(!StringUtil.isEmpty(order_id)){
			params.put("order_id", order_id);
		}

		String sign = MD5Util.buildMysignV1(params, this.secret_key);
		params.put("sign", sign);
		
		// 发送post请求
		HttpUtilManager httpUtil = HttpUtilManager.getInstance();
		String result = httpUtil.requestHttpPost(url_prex,this.ORDER_INFO_URL,
				params);

		return result;
	}

	@Override
	public String orders_info(String type, String symbol,
			String order_id) throws HttpException, IOException {
		// 构造参数签名
		Map<String, String> params = new HashMap<String, String>();
		params.put("api_key", api_key);
		if(!StringUtil.isEmpty(type)){
			params.put("type", type);
		}
		if(!StringUtil.isEmpty(symbol)){
			params.put("symbol", symbol);
		}
		if(!StringUtil.isEmpty(order_id)){
			params.put("order_id", order_id);
		}

		String sign = MD5Util.buildMysignV1(params, this.secret_key);
		params.put("sign", sign);
		
		// 发送post请求
		HttpUtilManager httpUtil = HttpUtilManager.getInstance();
		String result = httpUtil.requestHttpPost(url_prex,this.ORDERS_INFO_URL,
				params);

		return result;
	}

	@Override
	public String order_history(String symbol, String status,
			String current_page, String page_length) throws HttpException, IOException {
		// 构造参数签名
		Map<String, String> params = new HashMap<String, String>();
		params.put("api_key", api_key);
		if(!StringUtil.isEmpty(symbol)){
			params.put("symbol", symbol);
		}
		if(!StringUtil.isEmpty(status)){
			params.put("status", status);
		}
		if(!StringUtil.isEmpty(current_page)){
			params.put("current_page", current_page);
		}
		if(!StringUtil.isEmpty(page_length)){
			params.put("page_length", page_length);
		}

		String sign = MD5Util.buildMysignV1(params, this.secret_key);
		params.put("sign", sign);
		
		// 发送post请求
		HttpUtilManager httpUtil = HttpUtilManager.getInstance();
		String result = httpUtil.requestHttpPost(url_prex,this.ORDER_HISTORY_URL,
				params);

		return result;
	}

	public String getSecret_key() {
		return secret_key;
	}

	public void setSecret_key(String secret_key) {
		this.secret_key = secret_key;
	}

	

	public String getApi_key() {
		return api_key;
	}

	public void setApi_key(String api_key) {
		this.api_key = api_key;
	}

	public String getUrl_prex() {
		return url_prex;
	}

	public void setUrl_prex(String url_prex) {
		this.url_prex = url_prex;
	}

}