package com.bcxin.risk.zjzw;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.serializer.SerializerFeature;
import com.alibaba.gov.api.request.AtgBizAffairReceiveRequest;
import com.alibaba.gov.api.response.AtgBizAffairReceiveResponse;
import com.alibaba.gov.api.response.AtgBizAffairSupplementAcceptResponse;
import com.bcxin.risk.activity.ActivityDao;
import com.bcxin.risk.cache.redis.NewRedisUtil;
import com.bcxin.risk.common.webservice.Result;
import com.bcxin.risk.constant.DictConst;
import com.bcxin.risk.user.dao.UserDao;
import com.bcxin.risk.user.domain.User;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;
import java.util.UUID;


@Slf4j
@RestController
@RequestMapping("/zjzw/matter")
public class ZjzwCallbackController {

    @Autowired
    private ZjZwSbService zjZwSbService;

    @Resource
    private NewRedisUtil newRedisUtil;

    @Resource
    private UserDao userDao;

    /**
     * 收件回调接口
     * 第一阶段和第二阶段收件均回调同一接口
     *
     * @param
     * @return
     */
    @RequestMapping(value = "/receive", method = RequestMethod.POST)
    public AtgBizAffairReceiveResponse receiveCallBack(@RequestBody AtgBizAffairReceiveRequest request) {
        AtgBizAffairReceiveResponse response = new AtgBizAffairReceiveResponse();
        //todo 要有防止重复推送的机制，可以根据——办件号：提交时间（目前找不到这个提交时间）
        if (newRedisUtil.hasKey(DictConst.ZJZW_HEADER_FIRST + request.getProjId())) {
            String multiReceiveId = request.getExtInfo().get("multiReceiveId");
            if (StringUtils.isBlank(multiReceiveId)) {
                //重复办件，返回错误
                response.setResultStatus("F");
                response.setResultMsg("重复办件");
                response.setRequestId(String.valueOf(UUID.randomUUID()));
                return response;
            } else {
                //二阶段提交件，先判断是否重复提交，即redis里是否存在这个值
                if (newRedisUtil.hasKey(DictConst.ZJZW_HEADER_SECOND + multiReceiveId)) {
                    response.setResultStatus("F");
                    response.setResultMsg("二阶段幂等键重复");
                    response.setRequestId(String.valueOf(UUID.randomUUID()));
                    return response;
                } else {
                    //存redis
                    newRedisUtil.set(DictConst.ZJZW_HEADER_SECOND + multiReceiveId, multiReceiveId);
                    //todo 处理第二阶段提交的材料
                    //这里有问题，不能在接口回调完成之前关闭特殊程序。zjzwService.specProcFinish();
                }
            }
        }
        //处理接收到的办件数据
        try {
            zjZwSbService.receive(request);
            newRedisUtil.set(DictConst.ZJZW_HEADER_FIRST + request.getProjId(), JSON.toJSONString(request, SerializerFeature.DisableCircularReferenceDetect));//存redis
        } catch (Exception e) {
            log.error("接收办件出错", e);
            response.setResultStatus("F");
            response.setResultMsg("收件失败");
            response.setRequestId(String.valueOf(UUID.randomUUID()));
        }
        //2. 响应结果, MVC自动序列化response为JSON
        response.setResultStatus("S");
        response.setRequestId(String.valueOf(UUID.randomUUID()));
        return response;
    }

    /**
     * 补齐补正回调接口
     *
     * @param
     * @return
     */
    @RequestMapping(value = "/supplementAccept", method = RequestMethod.POST)
    public AtgBizAffairSupplementAcceptResponse supplementAcceptCallBack(@RequestBody AtgBizAffairSupplementAcceptRequestDiy request) {
        AtgBizAffairSupplementAcceptResponse response = new AtgBizAffairSupplementAcceptResponse();
        response.setResultStatus("S");
        //补齐补正的情况下，需要更新数据
//        newRedisUtil.set(DictConst.ZJZW_HEADER_FIRST + request.getProjId(), request);//存redis
        try {
            zjZwSbService.reReceive(request);
        } catch (Exception e) {
            log.error("", e);
            response.setResultStatus("F");
            response.setResultMsg("补齐补正收件失败");
            response.setRequestId(String.valueOf(UUID.randomUUID()));
//            e.printStackTrace();
        }

        //2. 响应结果, MVC自动序列化response为JSON
        response.setRequestId(String.valueOf(UUID.randomUUID()));
        return response;


    }

    /**
     * 检查该用户下是否已经绑定企业
     *
     * @param zwId
     * @return
     */
    @RequestMapping(value = "/checkOrgName")
    public AtgBizAffairSupplementAcceptResponse check(String zwId, String orgName) {
        AtgBizAffairSupplementAcceptResponse response = new AtgBizAffairSupplementAcceptResponse();
        response.setResultStatus("S");
        response.setRequestId(String.valueOf(UUID.randomUUID()));
        //先查询该用户的信息
        User user = userDao.findUserByZwid(zwId);
        if (user != null && user.getOrg() != null) {
            if (!StringUtils.equalsIgnoreCase(orgName, user.getOrg().getName())) {
                response.setResultMsg("该用户已经绑定企业,承办单位名称应为：" + user.getOrg().getName());
                response.setResultStatus("F");
//                return "该用户已经绑定企业,承办单位名称应为："+user.getOrg().getName();
            }
        }
        return response;
    }


}


