package com.zcloud.service.xgf.impl;

import com.zcloud.entity.Page;
import com.zcloud.entity.PageData;
import com.zcloud.mapper.datasource.xgf.*;
import com.zcloud.service.bus.CorpInfoService;
import com.zcloud.service.system.DepartmentService;
import com.zcloud.service.xgf.XgfUserService;
import com.zcloud.util.*;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

@Service
public class XgfUserServiceImpl implements XgfUserService {

    @Resource
    private XgfUserMapper xgfUserMapper;

    @Resource
    private XgfUserDetailsMapper xgfUserDetailsMapper;

    @Resource
    private DepartmentService departmentService;

    @Resource
    private FlowMapper flowMapper;

    @Resource
    private FlowDetailMapper flowDetailMapper;

    @Value("${preventionxgf.api.url}")
    private String prevention_xgf_url;

    @Override
    public void save(PageData pd) throws Exception {
        xgfUserMapper.save(pd);
    }

    @Override
    public void saveDetail(PageData pd) throws Exception {
        xgfUserDetailsMapper.save(pd);
    }

    @Override
    public List<PageData> list(Page page) throws Exception {
        return xgfUserDetailsMapper.listPage(page);
    }

    @Override
    @Transactional
    public void init(PageData request) throws Exception {
        List<PageData> list = Warden.getList(request.getString("infoList"));
        PageData condition = new PageData();
        for (PageData x : list) {
            if (StringUtils.isNotBlank(x.getString("USER_ID"))) {
                /* 1、 保存相关方用户信息 */
                condition.put("XGF_USER_ID", x.getString("USER_ID"));
                PageData entity = xgfUserMapper.findById(condition);
                if (entity == null || entity.size() <= 0) {
                    x.put("XGF_USER_ID", x.get("USER_ID"));
                    x.put("XGF_USER_DETAILS_ID", x.get("USER_ID"));
                    x.put("XGF_USER_NAME", x.get("NAME"));
                    x.put("VALID_FLAG", "1");
                    x.put("STATUS", "1");
                    x.put("CHECK_STATUS","0");
                    x.put("CREATED_TIME", DateUtil.getTime());
                    x.put("OPERATOR_TIME", DateUtil.getTime());
                    x.put("IS_DELETE", "0");
                    x.put("CREATE_TIME", DateUtil.getTime());
                    /* 监管部门 */
                    condition.clear();
                    condition.put("DEPARTMENT_ID", x.get("MANAGER_DEPARTMENT_ID"));
                    PageData regDepartmentEntity = departmentService.getCorpDepartment(condition);
                    if (regDepartmentEntity != null && regDepartmentEntity.size() > 0) {
                        x.put("MANAGER_DEPARTMENT_NAME", regDepartmentEntity.get("NAME"));
                    }

                    /* 主管部门 */
                    condition.clear();
                    condition.put("DEPARTMENT_ID", x.get("MAIN_DEPARTMENT_ID"));
                    regDepartmentEntity = departmentService.getCorpDepartment(condition);
                    x.put("MAIN_DEPARTMENT_NAME", regDepartmentEntity.get("NAME"));
                    if (regDepartmentEntity.size() > 0) {
                        x.put("MAIN_DEPARTMENT_NAME", regDepartmentEntity.get("NAME"));
                    }
                    xgfUserMapper.save(x);
                    xgfUserDetailsMapper.save(x);
                } else {
                    x.put("XGF_USER_ID", x.get("USER_ID"));
                    x.put("XGF_USER_DETAILS_ID", x.get("USER_ID"));
                    x.put("IS_DELETE", "0");
                    x.put("CREATE_TIME", DateUtil.getTime());
                    x.put("OPERATOR_TIME", DateUtil.getTime());
                    /* 监管部门 */
                    condition.clear();
                    condition.put("DEPARTMENT_ID", x.get("MANAGER_DEPARTMENT_ID"));
                    PageData regDepartmentEntity = departmentService.getCorpDepartment(condition);
                    if (regDepartmentEntity != null && regDepartmentEntity.size() > 0) {
                        x.put("MANAGER_DEPARTMENT_NAME", regDepartmentEntity.get("NAME"));
                    }
                    /* 主管部门 */
                    condition.clear();
                    condition.put("DEPARTMENT_ID", x.get("MAIN_DEPARTMENT_ID"));
                    regDepartmentEntity = departmentService.getCorpDepartment(condition);
                    x.put("MAIN_DEPARTMENT_NAME", regDepartmentEntity.get("NAME"));
                    if (regDepartmentEntity.size() > 0) {
                        x.put("MAIN_DEPARTMENT_NAME", regDepartmentEntity.get("NAME"));
                    }
                    x.put("IS_DELETE", "0");
                    x.put("VALID_FLAG", "1");
                    x.put("STATUS", "1");
                    x.put("CHECK_STATUS","0");
                    if ("2".equals(x.getString("STUDY_STATUS"))) {
                        x.put("STUDY_STATUS", "2");
                    } else {
                        x.put("STUDY_STATUS", entity.getString("STUDY_STATUS"));
                    }
                    x.put("STUDY_STATUS", entity.getString("STUDY_STATUS"));

                    xgfUserMapper.edit(x);
                    xgfUserDetailsMapper.edit(x);
                }
                /* 2、保存相关方人员流程审批信息 */
                condition.clear();
                condition.put("FOREIGN_KEY", x.getString("XGF_USER_ID"));
                condition.put("TYPE", "1");
                condition.put("VALID_FLAG", "1");
                PageData flow = flowMapper.findByCondition(condition);
                if (flow == null || flow.size() == 0) {
                    /* 保存审批流程信息 */
                    flow = new PageData();
                    flow.put("FLOW_ID", Warden.get32UUID());
                    flow.put("TYPE", "1");
                    flow.put("CREATOR", "");
                    flow.put("CREATOR_NAME", "");
                    flow.put("CREATOR_TIME", DateUtil.getTime());
                    flow.put("VALID_FLAG", "1");
                    flow.put("ISDELETE", "0");
                    flow.put("FOREIGN_KEY", x.getString("XGF_USER_ID"));
                    flowMapper.save(flow);
                    /* 保存审批流程明细信息 */
                    PageData flowDetail = new PageData();
                    flowDetail.put("FLOW_DETAIL_ID", Warden.get32UUID());
                    flowDetail.put("FLOW_ID", flow.getString("FLOW_ID"));
                    flowDetail.put("STEP_FLAG", "1");
                    flowDetail.put("STEP_NAME", "相关方数据将人员信息发送给企业端");
                    flowDetail.put("SORT", 0);
                    flowDetail.put("APPROVER_ID", "");
                    flowDetail.put("APPROVER_NAME", "");
                    flowDetail.put("APPROVER_TIME", DateUtil.getTime());
                    flowDetail.put("APPROVER_CORPINFO_ID", "");
                    flowDetail.put("APPROVER_CORPINFO_NAME", "");
                    flowDetail.put("PASS_FLAG", "1");
                    flowDetail.put("END_FLAG", "0");
                    flowDetail.put("ISDELETE", "0");
                    flowDetail.put("PARENT_ID", "0");
                    flowDetailMapper.save(flowDetail);
                } else {
                    condition.clear();
                    condition.put("FLOW_ID", flow.getString("FLOW_ID"));
                    PageData currentNode = flowDetailMapper.selectOne(condition);
                    PageData nextNode = new PageData();
                    nextNode.putAll(currentNode);
                    nextNode.put("FLOW_DETAIL_ID", Warden.get32UUID());
                    nextNode.put("SORT", Integer.parseInt(currentNode.get("SORT").toString()) + 1);
                    nextNode.put("PARENT_ID", currentNode.getString("FLOW_DETAIL_ID"));
                    nextNode.put("STEP_NAME", "相关方数据将人员打回后重新发送给企业端");
                    flowDetailMapper.save(nextNode);
                    currentNode.put("STEP_FLAG", "0");
                    flowDetailMapper.edit(currentNode);
                }

            }
        }
    }

    @Override
    public void approvalApplication(PageData request) throws Exception {

        List<String> list = Arrays.asList(request.getString("xgf_user_ids").split(","));

        PageData condition = new PageData();
        condition.put("XGF_USER_IDS", list);
        List<PageData> entities = xgfUserMapper.listByIds(condition);
        /* 校验所有数据是否都是正常状态 */
        if (entities.stream().anyMatch(n -> !"2".equals(n.getString("STATUS")))) {
            String name = entities.stream().filter(n -> !"2".equals(n.getString("STATUS"))).map(n -> n.getString("NAME")).collect(Collectors.joining(","));
            throw new RuntimeException("用户[" + name + "]在系统流程中无法被打回");
        }

        for (PageData x : entities) {
            x.put("VALID_FLAG", "0");
            x.put("STATUS", "1");
            xgfUserMapper.edit(x);
        }
    }

    @Override
    public List<PageData> flowlistPage(Page page) throws Exception {
        return xgfUserMapper.flowlistPage(page);
    }

    @Override
    @Transactional
    public void approve(PageData request) throws Exception {
        List<PageData> _list = Warden.getList(request.getString("list"));
        if (_list == null || _list.size() == 0) {
            throw new RuntimeException("请求数据异常");
        }
        List<String> list = _list.stream().map(x -> x.getString("XGF_USER_ID")).collect(Collectors.toList());
        PageData condition = new PageData();
        for (String x : list) {
            condition.put("XGF_USER_ID", x);
            PageData entity = xgfUserMapper.findById(condition);
            if (entity == null || entity.size() == 0) {
                throw new RuntimeException("未找到该用户");
            }
            // 通过则指定监管部门人员进行审核,不同过则打回相关方端(将CHECK_STATUS改为1)
            if ("1".equals(request.getString("STATUS"))) {
                entity.put("STATUS", "1");
                entity.put("VALID_FLAG", "1");
                entity.put("CHECK_STATUS","1");
                condition.clear();
                condition.put("XFG_USER_DETAILS_ID", x);
                PageData userInfo = xgfUserDetailsMapper.findById(condition);
                if (userInfo == null || userInfo.size() == 0) {
                    throw new RuntimeException("未找到该用户详细信息");
                }
                // 企业端人员审核完成后,指定企业端监管部门,中的某人进行审核
                userInfo.put("APPOINT_DEPARTMENT_ID", request.getString("APPOINT_DEPARTMENT_ID"));
                userInfo.put("APPOINT_DEPARTMENT_NAME", request.getString("APPOINT_DEPARTMENT_NAME"));
                userInfo.put("APPOINT_USER_ID", request.getString("APPOINT_USER_ID"));
                userInfo.put("APPOINT_USER_NAME", request.getString("APPOINT_USER_NAME"));
                xgfUserDetailsMapper.edit(userInfo);
            } else {
                entity.put("STATUS", "0");
                PageData key = new PageData();
                key.putAll(entity);
                key.put("USER_ID", condition.get("XGF_USER_ID"));
                key.put("STATUS", request.getString("STATUS"));
                Map result = HttpClientService.doPost(prevention_xgf_url + "openApi/user/approve", key);
                if (result == null || !"succeed".equals(result.get("result"))) {
                    throw new RuntimeException("请求失败");
                }
            }
            xgfUserMapper.edit(entity);
            /* 保存审批流程明细信息 */
            condition.clear();
            condition.put("FOREIGN_KEY", entity.getString("XGF_USER_ID"));
            condition.put("TYPE", "1");
            condition.put("VALID_FLAG", "1");
            PageData flow = flowMapper.findByCondition(condition);
            if (flow == null || flow.size() == 0){
                throw new RuntimeException("未找到该用户审批流程");
            }
            condition.clear();
            condition.put("FLOW_ID", flow.getString("FLOW_ID"));
            PageData currentNode = flowDetailMapper.selectOne(condition);
            PageData nextNode = new PageData();
            nextNode.put("FLOW_DETAIL_ID", Warden.get32UUID());
            nextNode.put("FLOW_ID", flow.getString("FLOW_ID"));
            nextNode.put("STEP_FLAG", "1");
            nextNode.put("STEP_NAME", "相关方数据将人员信息发送给企业端");
            nextNode.put("SORT", Integer.parseInt(currentNode.get("SORT").toString()) + 1);
            nextNode.put("APPROVER_ID", Jurisdiction.getUSER_ID());
            nextNode.put("APPROVER_NAME", Jurisdiction.getName());
            nextNode.put("APPROVER_TIME", DateUtil.getTime());
            nextNode.put("APPROVER_CORPINFO_ID", Jurisdiction.getCORPINFO_ID());
            nextNode.put("APPROVER_CORPINFO_NAME", "");
            nextNode.put("PASS_FLAG", request.getString("STATUS"));
            nextNode.put("END_FLAG", "0");
            nextNode.put("ISDELETE", "0");
            nextNode.put("PARENT_ID", currentNode.getString("FLOW_DETAIL_ID"));
            flowDetailMapper.save(nextNode);
            currentNode.put("STEP_FLAG", "0");
            flowDetailMapper.edit(currentNode);
        }
    }

    @Override
    public PageData findInfo(PageData condition) {
        return xgfUserMapper.getInfoById(condition);
    }

    @Override
    public List<PageData> findRecordList(PageData condition) throws Exception {
        return xgfUserMapper.findRecordList(condition);
    }

    @Override
    public List<PageData> getAppointApproveList(Page page) {
        List<PageData> list = xgfUserMapper.appointlistPage(page);
        for (PageData x : list) {
            if (StringUtils.isNotBlank(x.getString("APPOINT_USER_ID"))) {
                // TODO 判断当前人是否有权限审批
            }
        }
        return list;
    }
}