package org.warmsheep.huobi;

import java.util.TreeMap;

import org.apache.commons.lang.StringUtils;
import org.warmsheep.enums.CoinType;

public class HuobiService extends BaseService{
	
	private String huobiAccessKey;
	private String huobiSecretKey;
	private String huobiApiUrl;
	
	public HuobiService(String huobiAccessKey,String huobiSecretKey,String huobiApiUrl){
		this.huobiAccessKey = huobiAccessKey;
		this.huobiSecretKey = huobiSecretKey;
		this.huobiApiUrl = huobiApiUrl;
	}

	/**
	 * 下单接口
	 * 
	 * @param coinType
	 * @param price
	 * @param amount
	 * @param tradePassword
	 * @param tradeid
	 * @param method
	 * @return
	 * @throws Exception
	 */
	public String buy(int coinType, String price, String amount, String tradePassword, Integer tradeid, String method)
			throws Exception {
		TreeMap<String, Object> paraMap = new TreeMap<String, Object>();
		paraMap.put("method", method);
		paraMap.put("created", getTimestamp());
		paraMap.put("access_key", huobiAccessKey);
		paraMap.put("secret_key", huobiSecretKey);
		paraMap.put("coin_type", coinType);
		paraMap.put("price", price);
		paraMap.put("amount", amount);
		String md5 = sign(paraMap);
		paraMap.remove("secret_key");
		paraMap.put("sign", md5);
		if (StringUtils.isNotEmpty(tradePassword)) {
			paraMap.put("trade_password", tradePassword);
		}
		if (null != tradeid) {
			paraMap.put("trade_id", tradeid);
		}
		return post(paraMap, huobiApiUrl);
	}

	/**
	 * 提交市价单接口
	 * 
	 * @param coinType
	 * @param amount
	 * @param tradePassword
	 * @param tradeid
	 * @param method
	 * @return
	 * @throws Exception
	 */
	public String buyMarket(int coinType, String amount, String tradePassword, Integer tradeid, String method)
			throws Exception {
		TreeMap<String, Object> paraMap = new TreeMap<String, Object>();
		paraMap.put("method", method);
		paraMap.put("created", getTimestamp());
		paraMap.put("access_key", huobiAccessKey);
		paraMap.put("secret_key", huobiSecretKey);
		paraMap.put("coin_type", coinType);
		paraMap.put("amount", amount);
		String md5 = sign(paraMap);
		paraMap.remove("secret_key");
		paraMap.put("sign", md5);
		if (StringUtils.isNotEmpty(tradePassword)) {
			paraMap.put("trade_password", tradePassword);
		}
		if (null != tradeid) {
			paraMap.put("trade_id", tradeid);
		}
		return post(paraMap, huobiApiUrl);
	}

	/**
	 * 撤销订单
	 * 
	 * @param coinType
	 * @param id
	 * @param method
	 * @return
	 * @throws Exception
	 */
	public String cancelOrder(int coinType, long id, String method) throws Exception {
		TreeMap<String, Object> paraMap = new TreeMap<String, Object>();
		paraMap.put("method", method);
		paraMap.put("created", getTimestamp());
		paraMap.put("access_key", huobiAccessKey);
		paraMap.put("secret_key", huobiSecretKey);
		paraMap.put("coin_type", coinType);
		paraMap.put("id", id);
		String md5 = sign(paraMap);
		paraMap.remove("secret_key");
		paraMap.put("sign", md5);
		return post(paraMap, huobiApiUrl);
	}

	/**
	 * 获取账号详情
	 * 
	 * @param method
	 * @return
	 * @throws Exception
	 */
	public String getAccountInfo(String method) throws Exception {
		TreeMap<String, Object> paraMap = new TreeMap<String, Object>();
		paraMap.put("method", method);
		paraMap.put("created", getTimestamp());
		paraMap.put("access_key", huobiAccessKey);
		paraMap.put("secret_key", huobiSecretKey);
		String md5 = sign(paraMap);
		paraMap.remove("secret_key");
		paraMap.put("sign", md5);
		return post(paraMap, huobiApiUrl);
	}

	/**
	 * 查询个人最新10条成交订单
	 * 
	 * @param coinType
	 * @param method
	 * @return
	 * @throws Exception
	 */
	public String getNewDealOrders(int coinType, String method) throws Exception {
		TreeMap<String, Object> paraMap = new TreeMap<String, Object>();
		paraMap.put("method", method);
		paraMap.put("created", getTimestamp());
		paraMap.put("access_key", huobiAccessKey);
		paraMap.put("secret_key", huobiSecretKey);
		paraMap.put("coin_type", coinType);
		String md5 = sign(paraMap);
		paraMap.remove("secret_key");
		paraMap.put("sign", md5);
		return post(paraMap, huobiApiUrl);
	}

	/**
	 * 根据trade_id查询oder_id
	 * 
	 * @param coinType
	 * @param tradeid
	 * @param method
	 * @return
	 * @throws Exception
	 */
	public String getOrderIdByTradeId(int coinType, long tradeid, String method) throws Exception {
		TreeMap<String, Object> paraMap = new TreeMap<String, Object>();
		paraMap.put("method", method);
		paraMap.put("created", getTimestamp());
		paraMap.put("access_key", huobiAccessKey);
		paraMap.put("secret_key", huobiSecretKey);
		paraMap.put("coin_type", coinType);
		paraMap.put("trade_id", tradeid);
		String md5 = sign(paraMap);
		paraMap.remove("secret_key");
		paraMap.put("sign", md5);
		return post(paraMap, huobiApiUrl);
	}

	/**
	 * 获取所有正在进行的委托
	 * 
	 * @param coinType
	 * @param method
	 * @return
	 * @throws Exception
	 */
	public String getOrders(int coinType, String method) throws Exception {
		TreeMap<String, Object> paraMap = new TreeMap<String, Object>();
		paraMap.put("method", method);
		paraMap.put("created", getTimestamp());
		paraMap.put("access_key", huobiAccessKey);
		paraMap.put("secret_key", huobiSecretKey);
		paraMap.put("coin_type", coinType);
		String md5 = sign(paraMap);
		paraMap.remove("secret_key");
		paraMap.put("sign", md5);
		return post(paraMap, huobiApiUrl);
	}

	/**
	 * 获取订单详情
	 * 
	 * @param coinType
	 * @param id
	 * @param method
	 * @return
	 * @throws Exception
	 */
	public String getOrderInfo(int coinType, long id, String method) throws Exception {
		TreeMap<String, Object> paraMap = new TreeMap<String, Object>();
		paraMap.put("method", method);
		paraMap.put("created", getTimestamp());
		paraMap.put("access_key", huobiAccessKey);
		paraMap.put("secret_key", huobiSecretKey);
		paraMap.put("coin_type", coinType);
		paraMap.put("id", id);
		String md5 = sign(paraMap);
		paraMap.remove("secret_key");
		paraMap.put("sign", md5);
		return post(paraMap, huobiApiUrl);
	}

	/**
	 * 限价卖出
	 * 
	 * @param coinType
	 * @param price
	 * @param amount
	 * @param tradePassword
	 * @param tradeid
	 * @param method
	 * @return
	 * @throws Exception
	 */
	public String sell(int coinType, String price, String amount, String tradePassword, Integer tradeid, String method)
			throws Exception {
		TreeMap<String, Object> paraMap = new TreeMap<String, Object>();
		paraMap.put("method", method);
		paraMap.put("created", getTimestamp());
		paraMap.put("access_key", huobiAccessKey);
		paraMap.put("secret_key", huobiSecretKey);
		paraMap.put("coin_type", coinType);
		paraMap.put("price", price);
		paraMap.put("amount", amount);
		String md5 = sign(paraMap);
		paraMap.remove("secret_key");
		paraMap.put("sign", md5);
		if (StringUtils.isNotEmpty(tradePassword)) {
			paraMap.put("trade_password", tradePassword);
		}
		if (null != tradeid) {
			paraMap.put("trade_id", tradeid);
		}
		return post(paraMap, huobiApiUrl);
	}

	/**
	 * 市价卖出
	 * 
	 * @param coinType
	 * @param amount
	 * @param tradePassword
	 * @param tradeid
	 * @param method
	 * @return
	 * @throws Exception
	 */
	public String sellMarket(int coinType, String amount, String tradePassword, Integer tradeid, String method)
			throws Exception {
		TreeMap<String, Object> paraMap = new TreeMap<String, Object>();
		paraMap.put("method", method);
		paraMap.put("created", getTimestamp());
		paraMap.put("access_key", huobiAccessKey);
		paraMap.put("secret_key", huobiSecretKey);
		paraMap.put("coin_type", coinType);
		paraMap.put("amount", amount);
		String md5 = sign(paraMap);
		paraMap.remove("secret_key");
		paraMap.put("sign", md5);
		if (StringUtils.isNotEmpty(tradePassword)) {
			paraMap.put("trade_password", tradePassword);
		}
		if (null != tradeid) {
			paraMap.put("trade_id", tradeid);
		}
		return post(paraMap, huobiApiUrl);
	}
	
	/**
	 * 获取一分钟线
	 * @return
	 * @throws Exception
	 */
	public String getMinuteData(int coinType)throws Exception {
		if(coinType == CoinType.BTC.getKey()){
			return post(null, "http://api.huobi.com/staticmarket/btc_kline_001_json.js");
		} else if(coinType == CoinType.LTC.getKey()){
			return post(null, "http://api.huobi.com/staticmarket/ltc_kline_001_json.js");
		}
		return null;
	}
	/**
	 * 获取实时价格
	 * @return
	 * @throws Exception
	 */
	public String getRealTimeData(int coinType)throws Exception {
		if(coinType == CoinType.BTC.getKey()){
			return post(null, "http://api.huobi.com/staticmarket/ticker_btc_json.js");
		}else if(coinType == CoinType.LTC.getKey()){
			return post(null, "http://api.huobi.com/staticmarket/ticker_ltc_json.js");
		}
		return null;
	}
}