package fr.zng.xxzx.netty.dispatcher;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.math.BigDecimal;
import java.util.Map;

import org.apache.log4j.Logger;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.sun.net.httpserver.Headers;
import com.sun.net.httpserver.HttpExchange;
import com.sun.net.httpserver.HttpHandler;

import fr.zng.xxzx.common.bean.LjflResponse;
import fr.zng.xxzx.common.dao.DictDao;
import fr.zng.xxzx.common.dao.TdFlowDao;
import fr.zng.xxzx.common.dao.UnoDao;
import fr.zng.xxzx.common.dao.impl.DictDaoImpl;
import fr.zng.xxzx.common.dao.impl.TdFlowDaoImpl;
import fr.zng.xxzx.common.dao.impl.UnoDaoImpl;
import fr.zng.xxzx.common.entity.DictEntity;
import fr.zng.xxzx.common.entity.LjflCheckCardReplyDataEntity;
import fr.zng.xxzx.common.entity.LjflCheckCardReplyEntity;
import fr.zng.xxzx.common.entity.TdFlowEntity;
import fr.zng.xxzx.common.entity.UnoEntity;
import fr.zng.xxzx.common.util.StringUtil;
import fr.zng.xxzx.util.HttpExchangeUtil;

/**
 * 垃圾分类消息处理 - 上传投递记录
 * 
 * @author lyf
 *
 */
public class LjflPushRecordHandler implements HttpHandler {

	public Logger logger = Logger.getLogger(LjflPushRecordHandler.class);
    public LjflPushRecordHandler() {
    }
	
	@Override
	public void handle(HttpExchange exchange)  {

		// 定义返回结果
		LjflCheckCardReplyEntity result = new LjflCheckCardReplyEntity();
		result.errcode = 20000;
		result.errmsg = "操作失败";
		/**
		 * 解析请求参数与地址信息
		 */
		String requestMethod = exchange.getRequestMethod();
		logger.info("requestMethod="+requestMethod);
		if (requestMethod.equalsIgnoreCase("GET")||requestMethod.equalsIgnoreCase("POST")) {
			InputStream inputStream = exchange.getRequestBody();
			//解析入参
			Map<String, String> params = HttpExchangeUtil.getParamersPushRecord(inputStream);
			System.out.println("params: " + params);
			
			String Id = params.get("Id");
			String bankno = params.get("swipeNo");
			String weight = params.get("weight");
			String garbageTypeCode = params.get("garbageTypeCode");
			String deviceNo = params.get("deviceNo");
			if(bankno.length()>=24) {
				bankno = bankno.substring(0,24);
			}
			
//			String cno = updata.Type;
//			String colno = updata.Number;
			BigDecimal gar = new BigDecimal(weight).multiply(new BigDecimal("1000")).setScale(0);
			String garbage = gar+"";
			// 是否通过
			String flag = "";

			// 获取用户信息
			UnoDao dao = new UnoDaoImpl();
			// 通过银行卡号查找用户
			UnoEntity user = dao.getVillageUserCinfoByUno(bankno);
			if(user!=null) {
				TdFlowEntity en = new TdFlowEntity();
				// 投递
				en.setDel("0");
				en.setImei(Id);
				// cno 根据类型找到cno  dict表
				DictEntity dictEn1 = new DictEntity();
				String type = garbageTypeCode;
//				if(updata.Type.equals("不可回收")){
//					type = "不可回收";
//				} else if (updata.Type.equals("可回收物")){
//					type = "可回收";
//				}
				dictEn1.setDvalue(type);
				DictDao dictDao = new DictDaoImpl();
				DictEntity dictEn = dictDao.getDictByTypeValue(dictEn1);
				if(dictEn != null){
					en.setCno(dictEn.getDno());
				}
				en.setColno(deviceNo);
				en.setWeight(new BigDecimal(garbage));
				// 积分 重量为0时给1个积分 10g等于1积分
				BigDecimal bg2 = new BigDecimal(10);
				en.setPoint(new BigDecimal(garbage).compareTo(BigDecimal.ZERO) == 0 ? new BigDecimal("1.0")
						: new BigDecimal(garbage).divide(bg2, 1, BigDecimal.ROUND_HALF_UP));
//				en.setPoint(new BigDecimal("0"));
				en.setUno(user.getUno());
				en.setVno(user.getVno());
				en.setCreater(user.getUno());
				en.setUpdater(user.getUno());
				if (!StringUtil.isEmpty(user)) {
					// 投递前总量
					en.setBweight(user.getWeight());
					// 投递后总量
					en.setAweight(user.getWeight().add(new BigDecimal(garbage)));
					// 交易前积分
					en.setBpoint(user.getPoint());
					// 交易后积分
					en.setApoint(user.getPoint().add(en.getPoint()));
					if (InsertTdFlow(en) > 0) {
						flag = "01";
						result.errcode = 0;
						result.errmsg = "操作成功";
						LjflCheckCardReplyDataEntity dataEn = new LjflCheckCardReplyDataEntity();
						dataEn.integralBalance = Integer.parseInt(en.getApoint()+"");
						JSONObject jsonObject = new JSONObject();
						result.data = jsonObject.toJSONString(dataEn);
					} else {
						flag = "02";
						result.errcode = -1;
						result.errmsg = "操作失败";
					}
				} else {
					// 投递前总量
					en.setBweight(BigDecimal.ZERO);
					// 投递后总量
					en.setAweight(new BigDecimal(garbage));
					// 交易前积分
					en.setBpoint(BigDecimal.ZERO);
					// 交易后积分
					en.setApoint(en.getPoint());
					if (InsertTdFlowErr(en) > 0) {
						flag = "01";
						result.errcode = 0;
						result.errmsg = "操作成功";
						LjflCheckCardReplyDataEntity dataEn = new LjflCheckCardReplyDataEntity();
						dataEn.integralBalance = Integer.parseInt(en.getApoint()+"");
						JSONObject jsonObject = new JSONObject();
						result.data = jsonObject.toJSONString(dataEn);
					} else {
						flag = "02";
						result.errcode = -1;
						result.errmsg = "操作失败";
					}
				}
			} else {
				result.errcode = 20003;
				result.errmsg = "无此用户";
			}
			
		}

		// 结果返回给请求端
		Headers headers = exchange.getResponseHeaders();
		headers.add("Access-Control-Allow-Origin", "*");
		headers.add("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS");
		headers.add("Access-Control-Allow-Headers", "Content-Type");
		headers.add("Content-Type", "application/json");
		String data = "";
		OutputStream out = exchange.getResponseBody(); // 获得输出流
		try {
			exchange.sendResponseHeaders(200, data.length());
			out.write(JSON.toJSONString(result).getBytes());
			out.flush();
		} catch (IOException e) {
			e.printStackTrace();
		}finally{
			// 设置响应头属性及响应信息的长度
			try {
				out.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
	
	/**
	 * 插入异常投递记录
	 * 
	 * @return
	 */
	private int InsertTdFlowErr(TdFlowEntity en) {
		TdFlowDao dao = new TdFlowDaoImpl();
		return dao.insertErr(en);
	}

	/**
	 * 插入投递记录
	 * 
	 * @return
	 */
	private int InsertTdFlow(TdFlowEntity en) {
		TdFlowDao dao = new TdFlowDaoImpl();
		return dao.insert(en);
	}
}
