package com.qmth.distributed.print.business.templete.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.qmth.distributed.print.business.entity.TSyncExamStudentScore;
import com.qmth.distributed.print.business.entity.TeachClazz;
import com.qmth.distributed.print.business.service.ExamStudentService;
import com.qmth.distributed.print.business.service.TSyncExamStudentScoreService;
import com.qmth.distributed.print.business.service.TeachClazzService;
import com.qmth.distributed.print.business.templete.service.PushLogicService;
import com.qmth.teachcloud.common.bean.result.SyncCountResult;
import com.qmth.teachcloud.common.contant.SystemConstant;
import com.qmth.teachcloud.common.entity.BasicClazz;
import com.qmth.teachcloud.common.entity.BasicMajor;
import com.qmth.teachcloud.common.entity.SysUser;
import com.qmth.teachcloud.common.enums.ExceptionResultEnum;
import com.qmth.teachcloud.common.service.BasicClazzService;
import com.qmth.teachcloud.common.service.BasicMajorService;
import com.qmth.teachcloud.common.service.BasicStudentService;
import com.qmth.teachcloud.common.service.SysUserService;
import com.qmth.teachcloud.common.sync.CloudMarkingTaskUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.LinkedMultiValueMap;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.concurrent.atomic.AtomicInteger;

/**
 * @Description: 同步推送处理逻辑接口实现类
 * @Author: CaoZixuan
 * @Date: 2021-11-01
 */
@Service
public class PushLogicServiceImpl implements PushLogicService {
    private final static Logger log = LoggerFactory.getLogger(PushLogicServiceImpl.class);

    @Resource
    private SysUserService sysUserService;

    @Resource
    CloudMarkingTaskUtils stmmsUtils;

    @Resource
    BasicClazzService basicClazzService;

    @Resource
    TeachClazzService teachClazzService;

    @Resource
    TSyncExamStudentScoreService tSyncExamStudentScoreService;

    @Resource
    BasicStudentService basicStudentService;

    @Resource
    ExamStudentService examStudentService;

    @Resource
    BasicMajorService basicMajorService;

    @Override
    public Map<String, Object> executeUserPushLogic(Map<String, Object> map) throws IllegalAccessException {
        int correct = 0;
        int count = 0;
        SysUser sysUser = (SysUser) map.get(SystemConstant.SYS_USER);
        SyncCountResult syncCountResult = sysUserService.needPushAgainOperate(sysUser);
        map.put("correct", syncCountResult.getCorrectCount());
        map.put("count", syncCountResult.getTotalCount());
        return map;
    }

    /**
     * 成绩查询推送异步任务处理方法
     *
     * @param map 任务源
     * @return
     * @throws IllegalAccessException
     */
    @Override
    @Transactional
    public Map<String, Object> executeScorePushLogic(Map<String, Object> map) throws Exception {
        SysUser sysUser = (SysUser) map.get(SystemConstant.USER);
        Long schoolId = sysUser.getSchoolId();
        LinkedMultiValueMap<Long, Integer> semesterExamIdMap = (LinkedMultiValueMap<Long, Integer>) map.get("semesterExamIdMap");
        List<TSyncExamStudentScore> tSyncExamStudentScoreList = new ArrayList<>();
        List<String> errorTSyncExamStudentScoreList = new ArrayList<>();
        AtomicInteger count = new AtomicInteger(0);
        try {
            semesterExamIdMap.forEach((k, v) -> {
                for (Integer examId : v) {
                    int totalCount = stmmsUtils.getStudentCount(schoolId, examId, null, null, null, null, null, null, null, true);
                    count.set(count.get() + totalCount);
                    log.info("云阅卷：考试成绩考生数量查询接口调用，返回数量：{}", totalCount);
                    if (totalCount > 0) {
                        int pageSize = stmmsUtils.getDefaultPageSize();
                        int mod = totalCount % pageSize;
                        int pageNos = mod == 0 ? totalCount / pageSize : totalCount / pageSize + 1;
                        for (int i = 1; i <= pageNos; i++) {
                            List<Map> students = stmmsUtils.getStudentScore(schoolId, examId, null, null, null, null, null, null, null, true, i, pageSize);
                            for (Map student : students) {
                                try {
                                    Long orgId = null, clazzId = null, majorId = null;
                                    if (Objects.nonNull(student.get("studentCode")) && !Objects.equals("无", student.get("studentCode"))) {
                                        String studentCode = String.valueOf(student.get("studentCode"));
                                        String subjectCode = String.valueOf(student.get("subjectCode"));
                                        String examNumber = String.valueOf(student.get("examNumber"));
                                        Long printPlanId = Long.valueOf(student.get("examCode").toString()); // 计划ID

                                        List<Map> studentInfos = examStudentService.listStudentScoreSync(schoolId, studentCode, examNumber, subjectCode, printPlanId);
                                        if (studentInfos == null || studentInfos.size() == 0) {
                                            throw ExceptionResultEnum.ERROR.exception("未找到此考生信息");
                                        }
                                        Map stuMap = studentInfos.get(0);

                                        clazzId = stuMap.get("clazzId") == null || "".equals(stuMap.get("clazzId")) ? null : Long.parseLong(String.valueOf(stuMap.get("clazzId")));
                                        if (clazzId != null) {
                                            TeachClazz teachClazz = teachClazzService.getById(clazzId);
                                            if (teachClazz == null) {
                                                BasicClazz basicClazz = basicClazzService.getById(clazzId);
                                                if (Objects.nonNull(basicClazz)) {
                                                    majorId = basicClazz.getMajorId();
                                                    BasicMajor basicMajor = basicMajorService.getById(majorId);
                                                    orgId = basicMajor.getBelongOrgId();
                                                }
                                            }
                                        }
                                    }
                                    student.put(SystemConstant.SCHOOL_ID, schoolId);
                                    student.put("semesterId", k);
                                    student.put("orgId", orgId);
                                    student.put("clazzId", clazzId);
                                    student.put("majorId", majorId);
                                    student.put("userId", sysUser.getId());
                                    tSyncExamStudentScoreList.add(new TSyncExamStudentScore(student));
                                } catch (Exception e) {
                                    log.info("同步学生成绩信息失败:{}", e.getMessage());
                                    errorTSyncExamStudentScoreList.add(student.get("name") + "," + student.get("examNumber") + "\r\n");
                                }
                            }
                        }
                        if (tSyncExamStudentScoreList.size() > 0) {
                            tSyncExamStudentScoreService.remove(new QueryWrapper<TSyncExamStudentScore>().lambda().eq(TSyncExamStudentScore::getSchoolId, schoolId).eq(TSyncExamStudentScore::getExamId, Long.parseLong(String.valueOf(examId))));
                            tSyncExamStudentScoreService.saveOrUpdateBatch(tSyncExamStudentScoreList);
                        }
                    }
                }
            });
            map.computeIfAbsent("count", e -> count.get());
            map.computeIfAbsent("correct", e -> tSyncExamStudentScoreList.size());
            if (Objects.nonNull(errorTSyncExamStudentScoreList) && errorTSyncExamStudentScoreList.size() > 0) {
                map.computeIfAbsent("error", e -> "未同步成功数据" + errorTSyncExamStudentScoreList.size() + "条:\r\n" + errorTSyncExamStudentScoreList.toString());
            }
        } catch (Exception e) {
            log.info("云阅卷：接口调用失败：{}", e.getMessage());
            throw new RuntimeException("云阅卷：接口调用失败：" + e.getMessage());
        }
        return map;
    }
}