package com.palmnest.service.wechat;

import com.palmnest.application.bean.Attachment;
import com.palmnest.application.bean.UserInfo;
import com.palmnest.application.dto.Articles;

import java.io.IOException;
import java.io.Serializable;
import java.util.List;
import java.util.Map;

/**
 * 微信初始化接口
 *
 * @author yubing
 * @since 2015-02-27
 */
public interface WeChatApiManager {

	/**
	 * 签名验证
	 */
	public boolean checkSignature(String signature, String timestamp, String nonce) throws Exception;

	/**
	 * 公共帐号票据获取
	 */
	public String getAccessToken(String developId) throws Exception;

	/**
	 * 获取微信用户基本资料信息
	 */
	public UserInfo getUserInfo(String developId, String openid);


	/**
	 * 创建自定义菜单
	 *
	 * @param params 菜单json字符串
	 * @return 创建成功 true
	 * @throws Exception
	 */
	public boolean createMenu(String developId, String params) throws Exception;

	/**
	 * 查询自定义菜单
	 *
	 * @return 返回菜单的json字符串
	 * @throws Exception
	 */
	public String getMenuInfo(String developId) throws Exception;

	/**
	 * 自定义菜单删除
	 *
	 * @return 删除成功 true
	 * @throws Exception
	 */
	public boolean deleteMenu(String developId) throws Exception;

	/**
	 * 下载多媒体文件
	 *
	 * @param accessToken
	 * @param mediaId
	 * @return
	 * @throws IOException
	 */
	public Attachment getMedia(String developId, String mediaId) throws Exception;

	/**
	 * 用户授权
	 *
	 * @param code
	 * @param state
	 * @return
	 * @throws Exception
	 */
	public Map<String, String> oauth2(String code, String state) throws Exception;

	/**
	 * 微信发送客服消息接口
	 *
	 * @param msg       消息内容
	 * @param touser    接收者（微信用户openid）
	 * @param msgtype   消息类型 MsgTypes
	 * @param developId 开发者id（一般是服务号）
	 * @return 返回的json数据
	 * @throws Exception
	 */
	public <T extends Serializable> String sendMsg(T msg, String touser, String msgtype, String developId) throws Exception;

	/**
	 * 发送模板消息
	 *
	 * @param jsonMsg
	 * @return
	 */
	public String sendTemplateMsg(String developId, String jsonMsg) throws Exception;

	/**
	 * 发送客服消息
	 *
	 * @param jsonMsg
	 * @return
	 */
	public String sendServiceMsg(String developId, String jsonMsg) throws Exception;

	/**
	 * 发送模板消息
	 * 访客申请通知模板
	 *
	 * @param paramMap 参数
	 * @return
	 */
	public String sendTemplateMsg01(Map<String, String> paramMap);

	/**
	 * 发送模板消息
	 * 审核结果通知模块
	 *
	 * @param paramMap 参数
	 * @return
	 */
	public String sendTemplateMsg02(Map<String, String> paramMap);

	/**
	 * 发送模板消息
	 * 订单状态更新
	 *
	 * @param paramMap 参数
	 * @return
	 */
	public String sendTemplateMsg03(Map<String, String> paramMap);

	/**
	 * 发送模板消息
	 * 物业管理通知
	 *
	 * @param paramMap 参数
	 * @return
	 */
	public String sendTemplateMsg04(Map<String, String> paramMap);

	/**
	 * 发送模板消息
	 * 参与活动即将开始提醒
	 *
	 * @param paramMap 参数
	 * @return
	 */
	public String sendTemplateMsg05(Map<String, String> paramMap);

	/**
	 * 发送模板消息
	 * 订单支付成功
	 *
	 * @param paramMap 参数
	 * @return
	 */
	public String sendTemplateMsg06(Map<String, String> paramMap);

	/**
	 * 发送模板消息
	 * 充值成功或失败通知
	 *
	 * @param paramMap 参数
	 * @return
	 */
	public String sendTemplateMsg07(Map<String, String> paramMap);

	/**
	 * 发送模板消息
	 * 退款通知
	 *
	 * @param paramMap 参数
	 * @return
	 */
	public String sendTemplateMsg08(Map<String, String> paramMap);

	/**
	 * 发送模板消息
	 * 成员申请审核通知
	 *
	 * @param paramMap 参数
	 * @return
	 */
	public String sendTemplateMsg09(Map<String, String> paramMap);

	/**
	 * 处理图片
	 *
	 * @param developId
	 * @param imgServerIds
	 * @return
	 */
	public Map<String, String> dealGetMediaPic(String developId, String imgServerIds);

	public String sendTemplateMsg10(Map<String, String> paramMap);

	public String sendTemplateMsg11(Map<String, String> paramMap);
	
	public String sendTemplateMsg12(String openId,String sWxMsgTempId,String url,String content,String developId,String currentDateStr);
	

	public String sendTemplateWithOpenId(String developId, String templateId, String url, int wxUserId,
										 Map<String, String> params);

	/**
	 * 发送客服消息
	 *
	 * @param developId
	 * @param wxUserId
	 * @return
	 */
	public String sendServiceWithOpenId(String developId, int wxUserId, String content);

	public String sendCustomMsgWithOpenId(String openId, String content);

	public String sendCustomWithOpenId(String developId, int wxUserId, List<Articles> list);
}
