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

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.qmth.distributed.print.business.entity.TSyncExamLog;
import com.qmth.distributed.print.business.entity.TSyncExamStudentScore;
import com.qmth.distributed.print.business.service.ExamStudentService;
import com.qmth.distributed.print.business.service.TSyncExamStudentScoreService;
import com.qmth.distributed.print.business.templete.service.PushLogicService;
import com.qmth.teachcloud.common.contant.SystemConstant;
import com.qmth.teachcloud.common.enums.ExceptionResultEnum;
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 javax.annotation.Resource;
import java.util.*;

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

    @Resource
    CloudMarkingTaskUtils cloudMarkingTaskUtils;

    @Resource
    TSyncExamStudentScoreService tSyncExamStudentScoreService;

    @Resource
    ExamStudentService examStudentService;

    /**
     * 成绩查询推送异步任务处理方法
     *
     * @param tSyncExamLog 任务源
     * @return
     */
    @Override
    @Transactional
    public Map<String, Object> executeScorePushLogic(TSyncExamLog tSyncExamLog) {
        Long schoolId = tSyncExamLog.getSchoolId();
        Long semesterId = tSyncExamLog.getSemesterId();
        Long examId = tSyncExamLog.getExamId();
        Integer thirdRelateId = Integer.valueOf(String.valueOf(tSyncExamLog.getThirdRelateId()));
        List<TSyncExamStudentScore> tSyncExamStudentScoreList = new ArrayList<>();
        List<String> errorTSyncExamStudentScoreList = new ArrayList<>();
        Set<String> courseList = new HashSet<>();
        Map<String, Object> map = new HashMap<>();
        try {
            int totalCount = cloudMarkingTaskUtils.getStudentCount(schoolId, thirdRelateId, null, null, null, null, null, null, null);
            log.info("云阅卷：考试成绩考生数量查询接口调用，返回数量：{}", totalCount);
            if (totalCount > 0) {
                int pageSize = cloudMarkingTaskUtils.getDefaultPageSize();
                int mod = totalCount % pageSize;
                int pageNos = mod == 0 ? totalCount / pageSize : totalCount / pageSize + 1;
                for (int i = 1; i <= pageNos; i++) {
                    List<Map> students = cloudMarkingTaskUtils.getStudentScore(schoolId, thirdRelateId, null, null, null, null, null, null, null, true, i, pageSize);
                    for (Map student : students) {
                        try {
                            Long orgId = null, clazzId = null;
                            String clazzName = "";
                            String majorName = "";
                            String paperNumber = "";
                            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"));

                                courseList.add(subjectCode);

                                // 分布式印刷系统内部考生信息
                                List<Map> studentInfos = examStudentService.listStudentScoreSync(schoolId, studentCode, examNumber, subjectCode);
                                if (studentInfos == null || studentInfos.size() == 0) {
                                    throw ExceptionResultEnum.ERROR.exception("未找到此考生信息");
                                }
                                Map dpsPrintStuMap = studentInfos.get(0);

                                // 组装本系统内考生信息
                                clazzId = dpsPrintStuMap.get("clazzId") == null || "".equals(dpsPrintStuMap.get("clazzId")) ? null : Long.parseLong(String.valueOf(dpsPrintStuMap.get("clazzId")));
                                clazzName = String.valueOf(dpsPrintStuMap.get("clazzName"));
                                majorName = String.valueOf(dpsPrintStuMap.get("majorName"));
                                paperNumber = String.valueOf(dpsPrintStuMap.get("paperNumber"));
                                student.put("clazzId", clazzId);
                                student.put("clazzName", clazzName);
                                student.put("majorName", majorName);
                                student.put("paperNumber", paperNumber);
                            }

                            student.put(SystemConstant.SCHOOL_ID, schoolId);
                            student.put("semesterId", semesterId);
                            student.put("examId", examId);
                            student.put("thirdRelateId", thirdRelateId);
                            student.put("orgId", orgId);
                            student.put("userId", tSyncExamLog.getCreateId());
                            // 成功数据
                            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::getSemesterId, semesterId)
                            .eq(TSyncExamStudentScore::getExamId, Long.parseLong(String.valueOf(examId)))
                            .eq(TSyncExamStudentScore::getThirdRelateId, thirdRelateId));
                    tSyncExamStudentScoreService.saveOrUpdateBatch(tSyncExamStudentScoreList);
                }
            }

            map.putIfAbsent("count", totalCount);
            map.putIfAbsent("courses", courseList.size());
            map.computeIfAbsent("correct", e -> tSyncExamStudentScoreList.size());
            if (Objects.nonNull(errorTSyncExamStudentScoreList) && errorTSyncExamStudentScoreList.size() > 0) {
                map.computeIfAbsent("errorCount", e -> errorTSyncExamStudentScoreList.size());
                map.computeIfAbsent("error", e -> "未同步成功数据" + errorTSyncExamStudentScoreList.size() + "条:\r\n" + errorTSyncExamStudentScoreList.toString());
            }
        } catch (Exception e) {
            log.info("云阅卷：接口调用失败：{}", e.getMessage());
            throw new RuntimeException("云阅卷：接口调用失败：" + e.getMessage());
        }

//        if (!tSyncExamStudentScoreList.isEmpty()) {
//            try {
//                for (TSyncExamStudentScore tSyncExamStudentScore : tSyncExamStudentScoreList) {
//                    tSyncExamStudentScoreService.createImageTrajectory(tSyncExamStudentScore, ImageTrajectoryEnum.PREVIEW, true, tSyncExamLog.getCreateId());
//                }
//            } catch (Exception e) {
//
//            }
//        }
        return map;
    }
}