package com.bcxin.risk.communicate;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.TypeReference;
import com.bcxin.risk.activity.Activity;
import com.bcxin.risk.activity.ActivityDao;
import com.bcxin.risk.base.controller.BaseController;
import com.bcxin.risk.base.domain.util.DateUtil;
import com.bcxin.risk.common.dto.data.SBDataDTO;
import com.bcxin.risk.common.util.WebUtil;
import com.bcxin.risk.common.util.cipher.MD5Util;
import com.bcxin.risk.communicate.sp.SPService;
import com.bcxin.risk.constant.Const;
import com.bcxin.risk.constant.DictConst;
import com.bcxin.risk.log.ChangeLog;
import com.bcxin.risk.material.service.MaterialService;
import com.bcxin.risk.org.dto.OrgDataDto;
import com.bcxin.risk.org.service.GovOrgService;
import com.bcxin.risk.user.baseUser.service.UserService;
import com.bcxin.risk.user.contractor.service.ContractorService;
import com.bcxin.risk.user.dao.UserDao;
import com.bcxin.risk.user.domain.User;
import com.bcxin.risk.user.dto.data.UserDto;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;

@Controller
@RequestMapping("/receive/act")
public class ActivityReceiveController extends BaseController {

    @Autowired
    private UserDao userDao;
    @Autowired
    private ActivityReceiveService receiveService;
    @Autowired
    private UserService userService;
    @Autowired
    private ContractorService contractorService;
    @Autowired
    private ActivityDao activityDao;
    @Autowired
    private SPService spService;
    @Autowired
    private MaterialService materialService;
    @Autowired
    private GovOrgService govOrgService;

    /**
     * 接收pss到sb的活动信息
     */
    @RequestMapping("/fromPss")
    @ResponseBody
    public JSONObject pssToSb(HttpServletRequest request) {
        JSONObject json = new JSONObject();
        try {
            Map<String, String> paramMap = WebUtil.getParameterMap(request);
            String sign = paramMap.get("sign");
            String transSign = MD5Util.string2MD5(Const.ENVI + DateUtil.getCurrentDate());
            //验证秘钥
            if (!Objects.equals(transSign, sign)) {
                json.put("result", false);
                json.put("msg", "sign验证失败");
                return json;
            }

            String dataDTOStr = paramMap.get("dataDTO");
            SBDataDTO dataDTO = JSON.parseObject(dataDTOStr, SBDataDTO.class);
            Map<String, String> userParamMap = JSON.parseObject(dataDTO.getUserParam(), new TypeReference<HashMap<String, String>>() {
            });
            Map<String, String> activityParamMap = JSON.parseObject(dataDTO.getActivityParam(), new TypeReference<HashMap<String, String>>() {
            });
            Map<String, String> reportParamMap = JSON.parseObject(dataDTO.getReportParam(), new TypeReference<HashMap<String, String>>() {
            });
            Map<String, String> materialParamMap = JSON.parseObject(dataDTO.getMaterialParam(), new TypeReference<HashMap<String, String>>() {
            });
            Map<String, String> moduleParamMap = JSON.parseObject(dataDTO.getMaterialModuleParam(), new TypeReference<HashMap<String, String>>() {
            });

            //承办单位用户
            String userName = userParamMap.get("userName");
            User user = userDao.findUserByName(userName);
            if (user == null) {
                UserDto userDto = JSON.parseObject(dataDTO.getUserDTO(), UserDto.class);
                OrgDataDto orgDataDto = JSON.parseObject(dataDTO.getOrgDataDTO(), OrgDataDto.class);
                if (userDto.getUserType().equals(DictConst.USERTYPE_CBDWYH)) {
                    userService.register(new OrgDataDto(),userDto, false);
                } else if (userDto.getUserType().equals(DictConst.USERTYPE_GOV)) {
                    userService.govRegister(orgDataDto, userDto, false);
                    // 主站可推送表示已经审批通过
                    dataDTO.setUserName(userName);
                    dataDTO.setApproveStatus(DictConst.APPROVALSTATUS_SHTG);
                    govOrgService.subsiteGovUserAuditPass(dataDTO);
                }
                user = userDao.findUserByName(userName);

                if (user == null) {
                    json.put("result", false);
                    json.put("msg", "承办方不存在，用户名[" + userName + "]");
                    return json;
                }
            }
            // 同步活动信息+材料信息
            Activity activity = receiveService.saveActivity(user, activityParamMap, reportParamMap, materialParamMap, moduleParamMap);
            // 3.生成报批、报备材料
            /* 提交初审 */
            materialService.submitPrimary(activity, user, false);
            json.put("result", true);
            return json;
        } catch (Exception e) {
            json.put("result", false);
            json.put("msg", getStackMessage(e));
            e.printStackTrace();
            return json;
        }
    }


    /**
     * 接收pss到sb的活动差异日志
     */
    @RequestMapping("/changeLog/fromPss")
    @ResponseBody
    public JSONObject pssToSbChangeLog(HttpServletRequest request) {
        JSONObject json = new JSONObject();
        try {
            Map<String, String> paramMap = WebUtil.getParameterMap(request);
            String sign = paramMap.get("sign");
            String transSign = MD5Util.string2MD5(Const.ENVI + DateUtil.getCurrentDate());
            //验证秘钥
            if (!Objects.equals(transSign, sign)) {
                json.put("result", false);
                json.put("msg", "sign验证失败");
                return json;
            }

            String dataDTOStr = paramMap.get("dataDTO");
            SBDataDTO dataDTO = JSON.parseObject(dataDTOStr, SBDataDTO.class);
            String content = dataDTO.getContent();
            List<ChangeLog> changeLogList = JSON.parseArray(content, ChangeLog.class);
            for (ChangeLog changeLog : changeLogList) {
                Activity activity = activityDao.findActivityByActivityNo(changeLog.getActivityNo());
                // 重新设置id，
                changeLog.setBillId(activity.getOid().toString());
                changeLog.setSourceOid(changeLog.getOid());
            }
            String newContent = JSON.toJSONString(changeLogList);
            // 直接写入到文件
            spService.createActChangeLog(newContent);
            json.put("result", true);
            return json;
        } catch (Exception e) {
            json.put("result", false);
            json.put("msg", e.getMessage());
            return json;
        }
    }

    /**
     * 接收主站提交的审批
     *
     * @param request
     * @return
     */
    @RequestMapping("/fromPssApproveToSb")
    @ResponseBody
    public JSONObject pssApproveToSb(HttpServletRequest request) {
        JSONObject json = new JSONObject();
        try {
            Map<String, String> paramMap = WebUtil.getParameterMap(request);
            String sign = paramMap.get("sign");
            String transSign = MD5Util.string2MD5(Const.ENVI + DateUtil.getCurrentDate());
            //验证秘钥
            if (!Objects.equals(transSign, sign)) {
                json.put("result", false);
                json.put("msg", "sign验证失败");
                return json;
            }

            String dataDTOStr = paramMap.get("dataDTO");
            SBDataDTO dataDTO = JSON.parseObject(dataDTOStr, SBDataDTO.class);
            Activity activity = activityDao.findActivityByActivityNo(dataDTO.getActivityNo());
            // 同步活动信息
            contractorService.commitApproveToPolice(activity.getOid(), "1");
            json.put("result", true);
            return json;
        } catch (Exception e) {
            json.put("result", false);
            json.put("msg", e.getMessage());
            return json;
        }
    }
}
