package com.ssj.framework.weixin.card.util;

import com.alibaba.fastjson.JSONObject;
import com.ssj.framework.weixin.card.bean.ActivateVip;
import com.ssj.framework.weixin.card.bean.CardInfo;
import com.ssj.framework.weixin.card.bean.CardUpdate;
import com.ssj.framework.weixin.card.bean.UpdateMemberInfo;
import com.ssj.framework.weixin.card.qrcode.CardCode;
import com.ssj.framework.weixin.card.qrcode.MassCard;
import com.ssj.framework.weixin.card.qrcode.MultipleCardCode;
import com.ssj.framework.weixin.util.SHA1Util;
import com.ssj.framework.weixin.util.WeixinUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;

/** 
 * @author  ZhangCaibao 
 * @version 2017年3月2日 下午3:26:14 
 * 类说明 微信接入会员卡工具类
 */
public class CardUtil {
	private  static Logger logger = LoggerFactory.getLogger(CardUtil.class);
     //创建会员卡
	 private static String  CARD_CREATE= "https://api.weixin.qq.com/card/create?access_token=ACCESS_TOKEN";
	 /**
	  * 查看卡券详情接口
	  */
	 private static String  GET_CARD= "https://api.weixin.qq.com/card/get?access_token=ACCESS_TOKEN";
	 /**
	  * 批量查询卡券列表
	  */
	 private static String  BATCHGET= "https://api.weixin.qq.com/card/batchget?access_token=ACCESS_TOKEN";
	 // 创建二维码接口
	 private static String  RQCODE_CREATE= "https://api.weixin.qq.com/card/qrcode/create?access_token=ACCESS_TOKEN";
	 
	 // 根据OpenID列表群发【订阅号不可用，服务号认证后可用】
	 private static String MASS_SEND="https://api.weixin.qq.com/cgi-bin/message/mass/send?access_token=ACCESS_TOKEN";
	 /**
	  * 预览接口【订阅号与服务号认证后均可用】
	  */
	 private static String MASS_PREVIEW="https://api.weixin.qq.com/cgi-bin/message/mass/preview?access_token=ACCESS_TOKEN";
	 
	 /**
	  * 激活
	  */
	 private static String CARD_ACTIVATE="https://api.weixin.qq.com/card/membercard/activate?access_token=ACCESS_TOKEN";
	 
	 /**
	  * 线下核销卡券 步骤一：查询Code接口
	  */
	 private static String CARD_CODE_QUERY = "https://api.weixin.qq.com/card/code/get?access_token=ACCESS_TOKEN";  
	 
	 /**
	  * 线下核销卡券 步骤二：核销Code接口
	  */
	 private static String CARD_CODE_CONSUME = "https://api.weixin.qq.com/card/code/consume?access_token=ACCESS_TOKEN"; 
	 
	 /**
	  *获取用户已领取卡券接口 
	  */
	 private static String  USER_CARD_LIST ="https://api.weixin.qq.com/card/user/getcardlist?access_token=ACCESS_TOKEN";
	 
	 /**
	  * 修改卡券库存
	  */
	 private static String MODIFY_STOCK = "https://api.weixin.qq.com/card/modifystock?access_token=ACCESS_TOKEN";
	 
	 /**
	  * 拉取卡券概况数据接口
	  */
	 private static String CARD_TOTAL_INFO = "https://api.weixin.qq.com/datacube/getcardbizuininfo?access_token=ACCESS_TOKEN";
	 
	 /**
	  * 设置卡券测试白名单列表
	  */
	 private static String CARD_TEST_LIST = "https://api.weixin.qq.com/card/testwhitelist/set?access_token=ACCESS_TOKEN";
	 
	 /**
	  * 更新会员信息
	  */
	 private static String CARD_UPDATE_INFO = "https://api.weixin.qq.com/card/membercard/updateuser?access_token=ACCESS_TOKEN";
	 
	 private static String CARD_MEMBERCARD = "https://api.weixin.qq.com/card/update?access_token=ACCESS_TOKEN";
	 
	 /**
	  * 
	 * @param accessToken
	 * @return  
	 * 创建人：ZhangCaibao 
	 * 2017年3月2日 下午4:38:34 
	 * @JSONObject //创建卡券
	 * {
	   "errcode":0,
	   "errmsg":"ok",
	   "card_id":"p1Pj9jr90_SQRaVqYI239Ka1erkI"
        }
	  */
	 public  static JSONObject cardCreate(String accessToken, CardInfo card){
		    String url = CARD_CREATE.replace("ACCESS_TOKEN", accessToken);  
		    Map<String,CardInfo> map  =new HashMap<String, CardInfo>();
		    map.put("card", card);
		    String json = JSONObject.toJSONString(map);
		    logger.info("创建卡券请求-->"+json);
			JSONObject jsonObject =  WeixinUtil.httpRequest(url, "POST", json);
			
			return jsonObject;
	 }
	 /**
	  * 
	 * @param accessToken
	 * @param offset 查询卡列表的起始偏移量，从0开始，即offset: 5是指从从列表里的第六个开始读取。
	 * @param count  需要查询的卡片的数量（数量最大50）。
	 * @param list  支持开发者拉出指定状态的卡券列表 
	 *             “CARD_STATUS_NOT_VERIFY”, 待审核 ； “CARD_STATUS_VERIFY_FAIL”,审核失败；
	 *              “CARD_STATUS_VERIFY_OK”， 通过审核； “CARD_STATUS_DELETE”， 卡券被商户删除； 
	 *             “CARD_STATUS_DISPATCH”， 在公众平台投放过的卡券；
	 * @return
	 * 创建人：ZhangCaibao 
	 * 2017年12月15日 下午5:22:06 
	 * @JSONObject
	  */
	 public  static JSONObject batchget(String accessToken,int offset,int count,List<String> list){
		 String url = BATCHGET.replace("ACCESS_TOKEN", accessToken);  
		 Map<String,Object> map  =new HashMap<String, Object>();
		 map.put("offset", offset);
		 map.put("count", count);
		 if(list!=null&&list.size()>0){
			 map.put("status_list", list);
		 }
		 String json = JSONObject.toJSONString(map);
		 logger.info("批量查询卡券列表请求-->"+json);
		 JSONObject jsonObject =  WeixinUtil.httpRequest(url, "POST", json);
		 logger.info("批量查询卡券列表返回-->"+jsonObject.toString());
		 return jsonObject;
	 }
	 
	 /**
	  * 获取会员卡的基本信息
	 * @param accessToken
	 * @param card_id
	 * @return
	 * 创建人：ZhangCaibao 
	 * 2017年3月3日 上午10:44:05 
	 * @WxCard
	  */
	 public static  JSONObject get(String accessToken,String card_id){
		    String url = GET_CARD.replace("ACCESS_TOKEN", accessToken);  
		    Map<String,String> map  =new HashMap<String, String>();
		    map.put("card_id", card_id);
		    String json = JSONObject.toJSONString(map);
			JSONObject jsonObject =  WeixinUtil.httpRequest(url, "POST", json);
			logger.info("查询卡券信息返回-->"+jsonObject.toString());
			return jsonObject;
	 }
	 /**
	  * 步骤三：投放会员卡
	  * 支持开发者调用接口通过二维码、JS-SDK、群发消息等多种方式投放会员卡。
	  */
	 /**
	  * 开发者可以设置扫描二维码领取单张卡券
	 * @return
	 * 创建人：ZhangCaibao 
	 * 2017年3月3日 上午10:59:53 
	 * @JSONObject
	  */
	 public static JSONObject  createQrcode(String accessToken, CardCode cardCode){
		 String url = RQCODE_CREATE.replace("ACCESS_TOKEN", accessToken);  
		 String json = JSONObject.toJSONString(cardCode);
		 JSONObject jsonObject =  WeixinUtil.httpRequest(url, "POST", json);
		 logger.info(jsonObject.toString());
		 return	jsonObject;	
	 }
	 /**
	  * 开发者可以设置扫描二维码领取多张卡券
	  * @return
	  * 创建人：ZhangCaibao 
	  * 2017年3月3日 上午10:59:53 
	  * @JSONObject
	  */
	 public static JSONObject  createMultipleQrcode(String accessToken, MultipleCardCode cardCode){
		 String url = RQCODE_CREATE.replace("ACCESS_TOKEN", accessToken);  
		 String json = JSONObject.toJSONString(cardCode);
		 JSONObject jsonObject =  WeixinUtil.httpRequest(url, "POST", json);
		 logger.info(jsonObject.toString());
		 return	jsonObject;	
	 }
	 /**
	  * 根据OpenID列表群发卡券消息
	 * @param accessToken
	 * @param card
	 * @return
	 * 创建人：ZhangCaibao 
	 * 2017年3月3日 下午2:38:13 
	 * @JSONObject
	  */
	 public static JSONObject  massSend(String accessToken, MassCard card){
		 String url = MASS_SEND.replace("ACCESS_TOKEN", accessToken);  
		 String json = JSONObject.toJSONString(card);
		 JSONObject jsonObject =  WeixinUtil.httpRequest(url, "POST", json);
		 logger.info(jsonObject.toString());
		 return	jsonObject;	
		// return	NewsUtil.send(accessToken, card);	
	 }
	 /**
	  * 发送客服消息 发送卡卷
	 * @param accessToken
	 * @param openId
	 * @param card_id
	 * @param jsToken
	 * @return
	 * 创建人：ZhangCaibao 
	 * 2017年3月3日 下午3:00:03 
	 * @JSONObject
	  */
	 public static JSONObject custSend(String accessToken,String openId,String card_id,String jsToken){
		 Map<String,Object>  map  =new  HashMap<String, Object>();
		 map.put("touser", openId);
		 map.put("msgtype", "wxcard");
		 Map<String,Object>  wxcardMap  =new  HashMap<String, Object>();
		 wxcardMap.put("card_id", card_id);
		 Map<String,Object>  card_extMap  =new  HashMap<String, Object>();
		 
		 String timestamp = Long.toString(System.currentTimeMillis()/1000);
		 String noncestr = UUID.randomUUID().toString();
		 // 排序
		 String sortString =
							 "api_ticket=" + jsToken +
				             "&timestamp=" + timestamp +
				             "&card_id=" + card_id +
				             "&code=" + null +
				             "&openid=" +null  +
				             "&nonce_str=" +noncestr;
		 // 加密
		 String	signature = new SHA1Util().sha1(sortString);
		 
		 
		 card_extMap.put("code", null);
		 card_extMap.put("openid", null);
		 card_extMap.put("timestamp", null);
		 card_extMap.put("signature", null);
		 wxcardMap.put("card_ext", signature);
		 map.put("wxcard", wxcardMap);
		 String url = "https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token=ACCESS_TOKEN".replace("ACCESS_TOKEN", accessToken);  
	     String json = JSONObject.toJSONString(map);
		 JSONObject jsonObject =  WeixinUtil.httpRequest(url, "POST", json);
		 return jsonObject;
	 }
	 /**
	  * 预览卡卷
	 * @param accessToken
	 * @param openId
	 * @param card_id
	 * @param jsToken
	 * @return
	 * 创建人：ZhangCaibao 
	 * 2017年3月3日 下午3:14:18 
	 * @JSONObject
	  */
	 public static JSONObject massPreview(String accessToken,String openId,String card_id,String jsToken){
		 Map<String,Object>  map  =new  HashMap<String, Object>();
		 map.put("touser", openId);
		 map.put("msgtype", "wxcard");
		 Map<String,Object>  wxcardMap  =new  HashMap<String, Object>();
		 wxcardMap.put("card_id", card_id);
		 Map<String,Object>  card_extMap  =new  HashMap<String, Object>();
		 
		 String timestamp = Long.toString(System.currentTimeMillis()/1000);
		 String noncestr = UUID.randomUUID().toString();
		 // 排序
		 String sortString =
				 "api_ticket=" + jsToken +
				 "&timestamp=" + timestamp +
				 "&card_id=" + card_id +
				 "&code=" + null +
				 "&openid=" + null +
				 "&nonce_str=" +noncestr;
		 // 加密
		 String	signature =new SHA1Util().sha1(sortString);
		 card_extMap.put("code", null);
		 card_extMap.put("openid", null);
		 card_extMap.put("timestamp", null);
		 card_extMap.put("signature", null);
		 wxcardMap.put("card_ext", signature);
		 map.put("wxcard", wxcardMap);
		 String url = MASS_PREVIEW.replace("ACCESS_TOKEN", accessToken);  
		 String json = JSONObject.toJSONString(map);
		 JSONObject jsonObject =  WeixinUtil.httpRequest(url, "POST", json);
		 return jsonObject;
	 }
	 
	 /**
	  * 激活会员卡
	  * @param accessToken
	  * @param openId
	  * @param card_id
	  * @param jsToken
	  * @return
	  */
	 public static JSONObject cardActivate(String accessToken, ActivateVip vip){
		 String url = CARD_ACTIVATE.replace("ACCESS_TOKEN", accessToken);  
	     String json = JSONObject.toJSONString(vip);
		 JSONObject jsonObject =  WeixinUtil.httpRequest(url, "POST", json);
		 return jsonObject;
	 }
	 
	 /**
	  * 查询卡券code 状态
	  * @param accessToken
	  * @param code
	  * @param cardId
	  * @param check_consume
	  * @return
	  */
	 public static JSONObject cardCodeQuery(String accessToken,String code,String cardId,boolean check_consume){
		 logger.info("查询卡券code-->"+code);
		 String url = CARD_CODE_QUERY.replace("ACCESS_TOKEN", accessToken);  
		 Map<String, Object> map = new HashMap<String,Object>();
		 if(cardId!=null){
			 logger.info("查询卡券cardId-->"+cardId);
			 map.put("card_id", cardId);
		 }
		 map.put("code", code);
		 map.put("check_consume", check_consume);
	     String json = JSONObject.toJSONString(map);
		 JSONObject jsonObject =  WeixinUtil.httpRequest(url, "POST", json);
		 logger.info("查询卡券code 状态-->"+jsonObject);
		 return jsonObject;
	 }
	 public static JSONObject cardCodeQuery(String accessToken,String code){
		 return cardCodeQuery(accessToken, code, null, true);
	 }
	 
	 /**
	  * 核销卡券
	  * @param accessToken
	  * @param code
	  * @return
	  */
	 public static JSONObject cardCodeConsume(String accessToken,String code){
		 String url = CARD_CODE_CONSUME.replace("ACCESS_TOKEN", accessToken);  
		 Map<String, Object> map = new HashMap<String,Object>();
		 map.put("code", code);
		 logger.info("核销卡券code-->"+code);
	     String json = JSONObject.toJSONString(map);
		 JSONObject jsonObject =  WeixinUtil.httpRequest(url, "POST", json);
		 logger.info("核销卡券 状态-->"+jsonObject);
		 return jsonObject;
	 }
	 
	 /**
	  * 获取用户已领取卡券接口 
	  * @param accessToken
	  * @param openId
	  * @param cardId
	  * @return
	  */
	 public static JSONObject userCardList(String accessToken,String openId,String cardId){
		 String url = USER_CARD_LIST.replace("ACCESS_TOKEN", accessToken);  
		 Map<String, Object> map = new HashMap<String,Object>();
		 map.put("openid", openId);
		 map.put("card_id", cardId);
	     String json = JSONObject.toJSONString(map);
		 JSONObject jsonObject =  WeixinUtil.httpRequest(url, "POST", json);
		 return jsonObject;
	 }
	 
	 /**
	  * 
	  * @param accessToken    接口调用凭证
	  * @param cardId 卡券id
	  * @param increase_stock_value  增加多少库存，支持不填或填0。
	  * @param reduce_stock_value 减少多少库存，可以不填或填0。
	  * @return
	  */
	 public static JSONObject modifyCardStock(String accessToken,String cardId,int increase_stock_value,int reduce_stock_value){
		 String url = MODIFY_STOCK.replace("ACCESS_TOKEN", accessToken);  
		 Map<String, Object> map = new HashMap<String,Object>();
		 map.put("increase_stock_value", increase_stock_value);
		 map.put("reduce_stock_value", reduce_stock_value);
		 map.put("card_id", cardId);
	     String json = JSONObject.toJSONString(map);
		 JSONObject jsonObject =  WeixinUtil.httpRequest(url, "POST", json);
		 return jsonObject;
	 }
	 /**
	  * 
	  * @param accessToken
	  * @param cond_source 卡券来源，0为公众平台创建的卡券数据、1是API创建的卡券数据
	  * @param begin_date 查询数据的起始时间。
	  * @param end_date 	查询数据的截至时间。
	  * @return
	  */
	 public static JSONObject cardTotalInfo(String accessToken,String cond_source,String begin_date,String end_date){
		 String url = CARD_TOTAL_INFO.replace("ACCESS_TOKEN", accessToken);  
		 Map<String, Object> map = new HashMap<String,Object>();
		 map.put("begin_date", begin_date);
		 map.put("end_date", end_date);
		 map.put("cond_source", cond_source);
	     String json = JSONObject.toJSONString(map);
		 JSONObject jsonObject =  WeixinUtil.httpRequest(url, "POST", json);
		 return jsonObject;
	 }
	 
	 /**
	  * 设置测试白名单
	  * @param accessToken
	  * @param card
	  * @return
	  */
	 public  static JSONObject cardTestList(String accessToken,String testJson){
		    String url = CARD_TEST_LIST.replace("ACCESS_TOKEN", accessToken);  
			JSONObject jsonObject =  WeixinUtil.httpRequest(url, "POST", testJson);
			return jsonObject;
	 }
	 
	 /**
	  * 更新会员卡信息
	  * @param accessToken
	  * @param card
	  * @return
	  */
	 public  static JSONObject updateMemberInfo(String accessToken,UpdateMemberInfo card){
		    String url = CARD_UPDATE_INFO.replace("ACCESS_TOKEN", accessToken);  
		    String json = JSONObject.toJSONString(card);
		    logger.info("创建卡券请求-->"+json);
			JSONObject jsonObject =  WeixinUtil.httpRequest(url, "POST", json);
			
			return jsonObject;
	 }
	 
	 /**
	  * 更新会员卡基本信息
	  * @param accessToken
	  * @param card
	  * @return
	  */
	 public  static JSONObject updateMember(String accessToken,CardUpdate card){
		    String url = CARD_MEMBERCARD.replace("ACCESS_TOKEN", accessToken);  
		    String json = JSONObject.toJSONString(card);
		    logger.info("修改会员卡信息请求-->"+json);
			JSONObject jsonObject =  WeixinUtil.httpRequest(url, "POST", json);
			
			return jsonObject;
	 }
	 
	
}
