package com.tanpu.feo.feojob.service;


import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.tanpu.feo.feojob.dao.diagnose.entity.IfaAssetsEntity;
import com.tanpu.feo.feojob.dao.user.entity.*;
import com.tanpu.feo.feojob.dto.WorkDataDto;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;

import javax.annotation.Resource;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

@Service
@Slf4j
public class OrgSyncService {

    @Resource
    private OrgSyncByWxcpService orgSyncByWxcpService;
    @Resource
    private IfaAssetsService ifaAssetsService;
    @Resource
    private EmployeeRoleService employeeRoleService;
    @Resource
    private RoleService roleService;
    @Value("${wx.xcxqrcode}")
    String qrcodeurl;
    @Value("${user.wxDefaultImg}")
    String wxDefaultImg;
    @Resource
    private RestTemplate restTemplate;


    public void updateData(String orgId, WorkDataDto<UserInfoEntity> workUserInfo, WorkDataDto<EmployeeEntity> workEmployee, WorkDataDto<DepartmentEntity> workDepartment,
                           WorkDataDto<DepartmentEmployeeEntity> workDepartmentEmployee, WorkDataDto<EmployeeRoleEntity> workEmployeeRole) {
        //1 删除列表中 管理员 用户信息
        log.info("=======开始 删除管理员用户信息======");
        deleteAdmin(orgId, workUserInfo, workEmployee, workEmployeeRole);
        log.info("=======结束 删除管理员用户信息======");

        log.info("==========workUserInfo==========");
        log.info(JSONUtil.toJsonStr(workUserInfo));
        log.info("==========workEmployee==========");
        log.info(JSONUtil.toJsonStr(workEmployee));
        log.info("==========workDepartment===========");
        log.info(JSONUtil.toJsonStr(workDepartment));
        log.info("==========workDepartmentEmployee=========");
        log.info(JSONUtil.toJsonStr(workDepartmentEmployee));
        log.info("==========workEmployeeRole=========");
        log.info(JSONUtil.toJsonStr(workEmployeeRole));
        log.info("==================================");

        //2 执行 增删改
        List<IfaAssetsEntity> execute = orgSyncByWxcpService.execute(workUserInfo, workEmployee, workDepartment, workDepartmentEmployee, workEmployeeRole);
        for (IfaAssetsEntity ifaAssets : execute) {
            try {
                ifaAssetsService.insertIfaAssets(ifaAssets);
            } catch (Exception e) {
                log.info("======往ifaAssets写数据错误->用户ID:{} -> 错误信息-> {}======", ifaAssets.getIfaId(), e.getMessage());
            }
        }
    }

    public String createWechatXcxQrcode(String userId, String headImg) {
        String url = null;
        long startTime = System.currentTimeMillis();
        try {
            if (StrUtil.isBlank(headImg)) {
                headImg = wxDefaultImg;
            }
            String res = restTemplate.getForObject(qrcodeurl + "?userId=" + userId + "&headimage=" + headImg + "&params=" + userId, String.class);
            JSONObject jsonObject = JSONUtil.parseObj(res);
            String statusCode = (String) jsonObject.get("statusCode");
            if ("0000".equals(statusCode)) {
                url = (String) jsonObject.get("attributes");
            }

        } catch (Exception e) {
            log.error("======用户:{} 生成小程序球形码失败: {}======", userId, e.getMessage());
        }
        log.info("======用户:{} 生成小程序球形码成功 耗时: {}======", userId, System.currentTimeMillis() - startTime);
        return url;

    }

    private void deleteAdmin(String orgId, WorkDataDto<UserInfoEntity> workUserInfo, WorkDataDto<EmployeeEntity> workEmployee, WorkDataDto<EmployeeRoleEntity> workEmployeeRole) {
        // 获取 role
        Map<String, String> roleMap = roleService.findInfoNoAdmin();
        // 获取 admin 的员工id
        List<String> employeeIdList = employeeRoleService.findInfoByOrgIdAndAdmin(orgId, roleMap.get("m"));
        List<UserInfoEntity> deleteList1 = workUserInfo.getDeleteList();
        Iterator<UserInfoEntity> iterator1 = deleteList1.iterator();
        while (iterator1.hasNext()) {
            UserInfoEntity userInfo = iterator1.next();
            for (String s : employeeIdList) {
                if (s.equals(userInfo.getId())) {
                    iterator1.remove();
                }
            }
        }

        List<EmployeeEntity> deleteList2 = workEmployee.getDeleteList();
        Iterator<EmployeeEntity> iterator2 = deleteList2.iterator();
        while (iterator2.hasNext()) {
            EmployeeEntity employee = iterator2.next();
            for (String s : employeeIdList) {
                if (s.equals(employee.getEmployeeId())) {
                    iterator2.remove();
                }
            }
        }

        List<EmployeeRoleEntity> deleteList3 = workEmployeeRole.getDeleteList();
        Iterator<EmployeeRoleEntity> iterator3 = deleteList3.iterator();
        while (iterator3.hasNext()) {
            EmployeeRoleEntity employeeRole = iterator3.next();
            for (String s : employeeIdList) {
                if (s.equals(employeeRole.getEmployeeId())) {
                    iterator3.remove();
                }
            }
        }


    }
}