package org.sword.wechat4j.csc;

import java.io.File;
import java.util.List;

import org.apache.log4j.Logger;
import org.sword.lang.HttpUtils;
import org.sword.wechat4j.exception.WeChatException;
import org.sword.wechat4j.token.TokenProxy;
import org.sword.wechat4j.util.WeChatUtil;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
/**
 * 客服管理
 * @author Zhangxs
 * @date 2015-7-7
 * @version
 */
public class CustomerServicesManager {
	private static Logger logger = Logger.getLogger(CustomerServicesManager.class);
	
	/* 创建会话*/
	private static final String CUSTOMSERVICE_KFSESSION_CREATE_POST_URL = "https://api.weixin.qq.com/customservice/kfsession/create?access_token=";
	/* 关闭会话*/
	private static final String CUSTOMSERVICE_KFSESSION_CLOSE_POST_URL = "https://api.weixin.qq.com/customservice/kfsession/close?access_token=";
	/* 获取客户的会话状态*/
	private static final String CUSTOMSERVICE_KFSESSION_GETSESSION_GET_URL = "https://api.weixin.qq.com/customservice/kfsession/getsession?access_token=";
	/* 获取客服的会话列表*/
	private static final String CUSTOMSERVICE_KFSESSION_GETSESSIONLIST_GET_URL = "https://api.weixin.qq.com/customservice/kfsession/getsessionlist?access_token=";
	/* 获取未接入会话列表*/
	private static final String CUSTOMSERVICE_KFSESSION_GETWAITCASE_GET_URL = "https://api.weixin.qq.com/customservice/kfsession/getwaitcase?access_token=";
	/* 获取客服基本信息*/
	private static final String CUSTOMSERVICE_GETKFLIST_GET_URL = "https://api.weixin.qq.com/cgi-bin/customservice/getkflist?access_token=";
	/* 获取在线客服接待信息*/
	private static final String CUSTOMSERVICE_GETONLIEKFLIST_GET_URL = "https://api.weixin.qq.com/cgi-bin/customservice/getonlinekflist?access_token=";
	/* 添加客服账号*/
	private static final String CUSTOMSERVICE_KFACCOUNT_ADD_POST_URL = "https://api.weixin.qq.com/customservice/kfaccount/add?access_token=";
	/* 设置客服信息*/
	private static final String CUSTOMSERVICE_KFACCOUNT_UPDATE_POST_URL = "https://api.weixin.qq.com/customservice/kfaccount/update?access_token=";
	/* 上传客服头像*/
	private static final String CUSTOMSERVICE_KFACCOUNT_UPLOADHEADIMG_POST_URL = "http://api.weixin.qq.com/customservice/kfaccount/uploadheadimg?access_token=";
	/* 删除客服账号*/
	private static final String CUSTOMSERVICE_KFACCOUNT_DEL_POST_URL = "https://api.weixin.qq.com/customservice/kfaccount/del?access_token=";
	// 获取客服聊天记录接口
	private static final String CUSTOMSERVICE_MSGRECORD_GETRECORD_POST_URL="https://api.weixin.qq.com/customservice/msgrecord/getrecord?access_token=";
	private static final String PARAM_FILE = "media";
	private String accessToken;
	public CustomerServicesManager() {
		this.accessToken = TokenProxy.accessToken();
	}
	/**
	 * 创建会话
	 * @param openid 客户openid
	 * @param kf_account 完整客服账号,格式为:账号前缀@公众号微信号
	 * @return
	 * @throws WeChatException 
	 */
	public void kfSessionCreate(String openId,String kfAccount) throws WeChatException{
		kfSessionCreate(openId, kfAccount, null);
	}
	/**
	 * 创建会话
	 * @param openid 客户openid
	 * @param kf_account 完整客服账号,格式为:账号前缀@公众号微信号
	 * @param text 附加信息,文本会展示在客服人员的多客服客户端
	 * @return
	 * @throws WeChatException 
	 */
	public void kfSessionCreate(String openId,String kfAccount,String text) throws WeChatException{
		JSONObject jsonObject = new JSONObject();
		jsonObject.put("openid", openId);
		jsonObject.put("kf_account", kfAccount);
		if (text!=null){
			jsonObject.put("text", text);			
		}
		String resultStr = HttpUtils.post(CUSTOMSERVICE_KFSESSION_CREATE_POST_URL+this.accessToken,jsonObject.toJSONString());
		WeChatUtil.isSuccess(resultStr);
	}
	/**
	 * 关闭会话
	 * @param openid 客户openid
	 * @param kf_account 完整客服账号,格式为:账号前缀@公众号微信号
	 * @return
	 * @throws WeChatException 
	 */
	public void kfSessionClose(String openId,String kfAccount) throws WeChatException{
		kfSessionClose(openId, kfAccount, null);
	}
	/**
	 * 关闭会话
	 * @param openid 客户openid
	 * @param kf_account 完整客服账号,格式为:账号前缀@公众号微信号
	 * @param text 完整客服账号,格式为:账号前缀@公众号微信号
	 * @return
	 * @throws WeChatException 
	 */
	public void kfSessionClose(String openId,String kfAccount,String text) throws WeChatException{
		JSONObject jsonObject = new JSONObject();
		jsonObject.put("openid", openId);
		jsonObject.put("kf_account", kfAccount);
		if (text!=null){
			jsonObject.put("text", text);			
		}
		String resultStr = HttpUtils.post(CUSTOMSERVICE_KFSESSION_CLOSE_POST_URL+this.accessToken,jsonObject.toJSONString());
		WeChatUtil.isSuccess(resultStr);
	}
	/**
	 * 获取客户的会话状态 
	 * @param openId
	 * @return
	 */
	public CustomerServicesSession getSession(String openId) {
		String resultStr = HttpUtils.get(CUSTOMSERVICE_KFSESSION_GETSESSION_GET_URL+this.accessToken+"&openid="+openId);
		try {
			WeChatUtil.isSuccess(resultStr);
		} catch (WeChatException e) {
			logger.error(e.getMessage());
			e.printStackTrace();
			return null;
		}
		CustomerServicesSession customerServicesSession = JSON.parseObject(resultStr, CustomerServicesSession.class);
		return customerServicesSession;
	}
	/**
	 * 获取客服的会话列表
	 * @param KfAccount
	 * @return
	 */
	public List<CustomerServicesSession> getSessionList(String kfAccount) {
		String resultStr = HttpUtils.get(CUSTOMSERVICE_KFSESSION_GETSESSIONLIST_GET_URL+this.accessToken+"&kf_account="+kfAccount);
		try {
			WeChatUtil.isSuccess(resultStr);
		} catch (WeChatException e) {
			logger.error(e.getMessage());
			e.printStackTrace();
			return null;
		}
		String sessionlist = JSON.parseObject(resultStr).getString("sessionlist");
		List<CustomerServicesSession> customerServicesSessions = JSON.parseArray(sessionlist, CustomerServicesSession.class);
		return customerServicesSessions;
	}
	/**
	 * 获取未接入会话列表
	 * @return
	 */
	public List<CustomerServicesSession> getWaitCaseList() {
		String resultStr = HttpUtils.get(CUSTOMSERVICE_KFSESSION_GETWAITCASE_GET_URL+this.accessToken);
		try {
			WeChatUtil.isSuccess(resultStr);
		} catch (WeChatException e) {
			logger.error(e.getMessage());
			e.printStackTrace();
			return null;
		}
		String waitcaselist = JSON.parseObject(resultStr).getString("waitcaselist");
		List<CustomerServicesSession> customerServicesSessions = JSON.parseArray(waitcaselist, CustomerServicesSession.class);
		return customerServicesSessions;
	}
	/**
	 * 获取所有客服账号	
	 * @return
	 */
	public List<CustomerServices> getKfList() {
		String resultStr = HttpUtils.get(CUSTOMSERVICE_GETKFLIST_GET_URL+this.accessToken);
		try {
			WeChatUtil.isSuccess(resultStr);
		} catch (WeChatException e) {
			logger.error(e.getMessage());
			e.printStackTrace();
			return null;
		}
		String kf_list = JSONObject.parseObject(resultStr).getString("kf_list");
		List<CustomerServices> list = JSON.parseArray(kf_list,  CustomerServices.class);
		return list;
	}
	 
	/**
	 * 获取在线客服接待信息
	 * @return
	 */
	 
	public List<CustomerServices> getOnlieKfList() {
		String resultStr = HttpUtils.get(CUSTOMSERVICE_GETONLIEKFLIST_GET_URL+this.accessToken);		
		try {
			WeChatUtil.isSuccess(resultStr);
		} catch (WeChatException e) {
			logger.error(e.getMessage());
			e.printStackTrace();
			return null;
		}
		JSONObject jsonObject = JSONObject.parseObject(resultStr);
		List<CustomerServices> list = JSON.parseArray(jsonObject.getString("kf_online_list"),  CustomerServices.class);
		return list;
	}
	
	/**
	 * 添加客服账号 
	 * @param kfAccount 完整客服账号,格式为:账号前缀@公众号微信号,账号前缀最多10个字符,必须是英文或者数字字符。如果没有公众号微信号,请前往微信公众平台设置。
	 * @param nickName 客服昵称,最长6个汉字或12个英文字符
	 * @param password 客服账号登录密码,格式为密码明文的32位加密MD5值
	 * @return
	 * @throws WeChatException 
	 */
	public void kfAddAccount(String kfAccount,String nickName,String password) throws WeChatException{
		JSONObject jsonObject = new JSONObject();
		jsonObject.put("kf_account", kfAccount);
		jsonObject.put("nickname", nickName);
		jsonObject.put("password", password);
		String resultStr = HttpUtils.post(CUSTOMSERVICE_KFACCOUNT_ADD_POST_URL+this.accessToken,jsonObject.toJSONString());
		WeChatUtil.isSuccess(resultStr);
	}
	/**
	 * 设置客服信息
	 * @param kf_account 完整客服账号,格式为:账号前缀@公众号微信号
	 * @param nickname	客服昵称,最长6个汉字或12个英文字符
	 * @param password	客服账号登录密码,格式为密码明文的32位加密MD5值
	 * @return
	 * @throws WeChatException 
	 */
	public void kfUpdateAccount(String kfAccount,String nickName,String password) throws WeChatException {
		JSONObject jsonObject = new JSONObject();
		jsonObject.put("kf_account", kfAccount);
		jsonObject.put("nickname", nickName);
		jsonObject.put("password", password);
		String resultStr =HttpUtils.post(CUSTOMSERVICE_KFACCOUNT_UPDATE_POST_URL+this.accessToken, jsonObject.toJSONString());
		WeChatUtil.isSuccess(resultStr);
	}
	/**
	 * 上传客服头像
	 * 头像图片文件必须是jpg格式,推荐使用640*640大小的图片以达到最佳效果
	 * @param kfAccount 完整客服账号,格式为:账号前缀@公众号微信号
	 * @param file	客服头像
	 * @return
	 * @throws WeChatException 
	 */
	public void kfUploadHeadImg(String kfAccount,File file) throws WeChatException{
		String resultStr = HttpUtils.postFile(CUSTOMSERVICE_KFACCOUNT_UPLOADHEADIMG_POST_URL+this.accessToken+"&kf_account="+kfAccount,PARAM_FILE, file);
		WeChatUtil.isSuccess(resultStr);
	}

	/**
	 * 删除客服账号
	 * @param kfAccount	完整客服账号,格式为:账号前缀@公众号微信号
	 * @return
	 * @throws WeChatException 
	 */
	public void kfDelAccount(String kfAccount) throws WeChatException{
		String resultStr = HttpUtils.post(CUSTOMSERVICE_KFACCOUNT_DEL_POST_URL+this.accessToken+"&kf_account="+kfAccount);
		WeChatUtil.isSuccess(resultStr);
	}
	/**
	 * 获取客服聊天记录
	 * @param starttime 查询开始时间,UNIX时间戳
	 * @param endtime 查询结束时间,UNIX时间戳,每次查询不能跨日查询
	 * @param pageindex 查询第几页,从1开始
	 * @param pagesize 每页大小,每页最多拉取50条
	 * @return
	 */
	public List<Record> getRecord(long starttime,long endtime, int pageindex,int pagesize) {
		JSONObject data = new JSONObject();
		data.put("endtime", endtime);
		data.put("pageindex", pageindex);
		data.put("pagesize", pagesize);
		data.put("starttime", starttime);
		String resultStr = HttpUtils.post(CUSTOMSERVICE_MSGRECORD_GETRECORD_POST_URL+this.accessToken, data.toJSONString());
		try {
			WeChatUtil.isSuccess(resultStr);
		} catch (WeChatException e) {
			logger.error(e.getMessage());
			e.printStackTrace();
			return null;
		}
		String recordlist = JSON.parseObject(resultStr).getString("recordlist");
		List<Record> records = JSON.parseArray(recordlist, Record.class);
		return records;
	}
}