package com.tanpu.feo.feojob.service;

import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONUtil;
import com.fengwenyi.api.result.ResultTemplate;
import com.tanpu.feo.feojob.dto.JyzyTeamDto;
import com.tanpu.feo.feojob.dto.OrgInfoDto;
import com.tanpu.feo.feojob.dto.OrgSyncDto;
import com.tanpu.feo.feojob.dto.WorkDataDto;
import com.tanpu.feo.feojob.entity.*;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.stream.Collectors;

@Service
@Slf4j
public class OrgSyncByJyzyService {
    @Resource
    private OrgService orgService;
    @Resource
    private UserInfoService userInfoService;
    @Resource
    private DepartmentService departmentService;
    @Resource
    private DepartmentEmployeeService departmentEmployeeService;
    @Resource
    private EmployeeService employeeService;
    @Resource
    private EmployeeRoleService employeeRoleService;
    @Resource
    private RoleService roleService;
    @Resource
    private OrgSyncByWxcpService orgSyncByWxcpService;
    @Resource
    private IfaAssetsService ifaAssetsService;
    @Resource
    private JyzyOrgService jyzyOrgService;
    @Resource
    private JyzyTeamService jyzyTeamService;
    @Resource
    private JyzyUserInfoService jyzyUserInfoService;
    @Resource
    private OrgSyncService orgSyncService;

    public ResultTemplate<String> orgSyncByJyzy(OrgSyncDto orgSyncDto) {
        try {
            //1 从精业展业 数据库中 获取组织及用户 信息
            List<JyzyTeamDto> jyzyTeamDtoList = getJyzyTeamByOrgCode(orgSyncDto.getJyzyOrgCode());
            log.info("====== 精业展业 获取的数据为:{}", JSONUtil.toJsonStr(jyzyTeamDtoList));
            //2 从feo 数据库中 获取现有的 组织及人员 信息
            OrgInfoDto orgInfoDto = getOrgInfoByFeoOrgCode(orgSyncDto.getFeoOrgCode());
            log.info("====== 理财师机构版 获取的数据为:{}", JSONUtil.toJsonStr(orgInfoDto));
            //3 数据对比
            WorkDataDto<UserInfoEntity> workUserInfo = new WorkDataDto<>();
            WorkDataDto<EmployeeEntity> workEmployee = new WorkDataDto<>();
            WorkDataDto<DepartmentEntity> workDepartment = new WorkDataDto<>();
            WorkDataDto<DepartmentEmployeeEntity> workDepartmentEmployee = new WorkDataDto<>();
            WorkDataDto<EmployeeRoleEntity> workEmployeeRole = new WorkDataDto<>();
            dataCompare(workUserInfo, workEmployee, workDepartment, workDepartmentEmployee, workEmployeeRole, jyzyTeamDtoList, orgInfoDto);
            //4 数据操作
//            orgSyncService.updateData(orgInfoDto.getOrgId(), workUserInfo, workEmployee, workDepartment, workDepartmentEmployee, workEmployeeRole);

        } catch (Exception e) {
            return ResultTemplate.fail(e.getMessage());
        }
        return ResultTemplate.success("同步成功");
    }

    private void dataCompare(WorkDataDto<UserInfoEntity> workUserInfo, WorkDataDto<EmployeeEntity> workEmployee, WorkDataDto<DepartmentEntity> workDepartment,
                             WorkDataDto<DepartmentEmployeeEntity> workDepartmentEmployee, WorkDataDto<EmployeeRoleEntity> workEmployeeRole,
                             List<JyzyTeamDto> jyzyTeamDtoList, OrgInfoDto orgInfoDto) {
        log.info("======开始数据对比======");
        HashMap<String, JyzyUserInfoEntity> jyzyUserInfoHashMap = new HashMap<>();
        jyzyTeamDtoList.forEach(jyzyTeamDto -> jyzyTeamDto.getJyzyUserInfos().forEach(jyzyUserInfo -> jyzyUserInfoHashMap.put(jyzyUserInfo.getId(), jyzyUserInfo)));
        // 1 user_info
        List<UserInfoEntity> insertUserInfoList = new ArrayList<>();
        List<UserInfoEntity> deleteUserInfoList = new ArrayList<>();
        List<UserInfoEntity> updateUserInfoList = new ArrayList<>();
//        orgInfoDto.getUserInfoList().forEach(userInfo -> {
//            JyzyUserInfo jyzyUserInfo = jyzyUserInfoHashMap.get(userInfo.getId());
//            // 删除
//            if (ObjectUtil.isNull(jyzyUserInfo)) {
//                deleteUserInfoList.add(userInfo);
//                return; // 跳过当前循环
//            }
//            // 更新
//            if (!jyzyUserInfo.getMD5().equals(userInfo.getMD5())) {
//                userInfo.updata(jyzyUserInfo);
//                updateUserInfoList.add(userInfo);
//            }
//            jyzyUserInfoHashMap.remove(userInfo.getId());
//        });
//        jyzyUserInfoHashMap.forEach((key, jyzyUserInfo) -> {
//            // 新增
//            UserInfo userInfo = new UserInfo(jyzyUserInfo);
//            insertUserInfoList.add(userInfo);
//        });
        workUserInfo.setDeleteList(deleteUserInfoList);
        workUserInfo.setInsertList(insertUserInfoList);
        workUserInfo.setUpdateList(updateUserInfoList);
        log.info("======结束数据对比======");
    }

    /**
    * @description:  根据理财师机构版的机构code 获取其的 机构及用户信息列表
    * @Author: zejia zj wu
    * @date: 2021/5/27 3:13 下午
    */
    private OrgInfoDto getOrgInfoByFeoOrgCode(String feoOrgCode) throws Exception {
        OrgInfoDto.OrgInfoDtoBuilder orgInfoDtoBuilder = OrgInfoDto.builder();
        try {
            // 1 根据orgcode 获取机构信息
            OrgEntity org = orgService.findByOrgCode(feoOrgCode);
            if (ObjectUtil.isEmpty(org) || StrUtil.isBlank(org.getId())) {
                throw new Exception("feoOrgCode 不存在");
            }
            String orgId = org.getId();
            orgInfoDtoBuilder.orgId(orgId);
            // 2 根据 orgId 获取 userInfoList信息
            List<UserInfoEntity> userInfoList = userInfoService.getUserInfoListByOrgId(orgId);
            orgInfoDtoBuilder.userInfoList(userInfoList);
            // 3 根据 orgId 获取 Employee信息
            List<EmployeeEntity> employeeList = employeeService.getEmployeeSListByOrgId(orgId);
            orgInfoDtoBuilder.employeeList(employeeList);
            // 4 根据 orgId 获取 Department信息
            List<DepartmentEntity> departmentList = departmentService.findDepartmentByOrgId(orgId);
            orgInfoDtoBuilder.departmentList(departmentList);
            // 5 根据 orgId 获取 DepartmentEmployee信息
            List<DepartmentEmployeeEntity> departmentEmployeeList = departmentEmployeeService.findInfoByOrgId(orgId);
            orgInfoDtoBuilder.departmentEmployeeList(departmentEmployeeList);
            // 6 根据 orgId 获取 EmployeeRole信息
            List<EmployeeRoleEntity> employeeRoleList = employeeRoleService.findInfoByOrgId(orgId);
            orgInfoDtoBuilder.employeeRoleList(employeeRoleList);
            // 7 整理数据 将用户安排到 组织下面
            return orgInfoDtoBuilder.build();
        } catch (Exception e) {
            log.error("=======从理财师机构版 数据库中 获取组织及用户 信息 方法出错-->{}======", e.getMessage());
            throw new Exception("同步失败,-->" + e.getMessage());
        }
    }

    /**
    * @description: 根据精业展业的机构code 获取精业展业的 机构及人员信息列表
    * @Author: zejia zj wu
    * @date: 2021/5/27 3:12 下午
    */
    private List<JyzyTeamDto> getJyzyTeamByOrgCode(String jyzyOrgCode) throws Exception {
        try {
            // 1 根据orgcode 获取机构信息
            JyzyOrgEntity jyzyOrg = jyzyOrgService.getOrgByOrgCode(jyzyOrgCode);
            if (ObjectUtil.isEmpty(jyzyOrg) || StrUtil.isBlank(jyzyOrg.getId())) {
                throw new Exception("jyzyOrgCode 不存在");
            }
            // 2 根据 orgId 获取 团队信息
            List<JyzyTeamEntity> jyzyTeamList = jyzyTeamService.getTeamListByOrgId(jyzyOrg.getId());
            // 3 根据 orgId 获取 用户信息
            List<JyzyUserInfoEntity> userInfoList = jyzyUserInfoService.getUserListByOrgId(jyzyOrg.getId());
            // 4 整理数据 将用户安排到 组织下面
            return jyzyTeamList.stream().map(jyzyTeam -> JyzyTeamDto.builder()
                    .jyzyTeam(jyzyTeam).jyzyUserInfos(
                            userInfoList.stream().filter(jyzyUserInfo -> jyzyUserInfo.getTeamId().equals(jyzyTeam.getId())).collect(Collectors.toList())
                    ).build()).collect(Collectors.toList());
        } catch (Exception e) {
            log.error("=======从精业展业 数据库中 获取组织及用户 信息 方法出错-->{}======", e.getMessage());
            throw new Exception("同步失败,-->" + e.getMessage());
        }
    }

}