package com.ruoyi.common;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.domain.*;
import com.ruoyi.mapper.TaskMapper;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Objects;

public class DataStatisticsUtils {

    public static int calculateStandards(List<ReviewStandard> standards) {
        return standards.size();
    }

    public static int calculateStandardsPass(List<ReviewStandard> standards, Map<Long, ReviewDetailsResult> resultMap) {

        int standardsPass = 0;

        for(ReviewStandard standard : standards) {

            List<ReviewDetails> details = getDetailsByStandard(standard);

            boolean isPass = true;

            for(ReviewDetails reviewDetails : details) {

                Integer passed = detailsIsPass(reviewDetails, resultMap);
                if(passed == null) {
                    isPass = false;
                }

                if(Objects.equals(passed, ReviewStandard.NO_PASSED)) {
                    isPass = false;
                }

            }

            if(isPass) {
                standardsPass = standardsPass + 1;
            }
        }

        return standardsPass;

    }

    public static int calculateStandardsNoPass(List<ReviewStandard> standards, Map<Long, ReviewDetailsResult> resultMap) {

        int standardsNoPass = 0;

        for(ReviewStandard standard : standards) {

            List<ReviewDetails> details = getDetailsByStandard(standard);
            boolean isPass = false;

            for(ReviewDetails reviewDetails : details) {

                Integer passed = detailsIsPass(reviewDetails, resultMap);
                if(passed == null) {
                    isPass = false;
                }

                if(Objects.equals(passed, ReviewStandard.NO_PASSED)) {
                    isPass = true;
                }


            }

            if(isPass) {
                standardsNoPass = standardsNoPass + 1;
            }
        }

        return standardsNoPass;

    }

    public static int calculateDetails(List<ReviewStandard> standards) {

        //审查细则(条)
        int detailsNum = 0;

        for(ReviewStandard standard : standards) {

            List<ReviewDetails> details = getDetailsByStandard(standard);
            detailsNum = detailsNum + details.size();

        }

        return detailsNum;

    }

    public static int calculateDetailsPass(List<ReviewStandard> standards, Map<Long, ReviewDetailsResult> resultMap) {

        int detailsPass = 0;

        for(ReviewStandard standard : standards) {
            List<ReviewDetails> details = getDetailsByStandard(standard);
            for(ReviewDetails reviewDetails : details) {

                if (detailsIsPass(reviewDetails, resultMap) == null) {
                    continue;
                }

                if(Objects.equals(detailsIsPass(reviewDetails, resultMap), ReviewStandard.PASSED)) {
                    detailsPass = detailsPass + 1;
                }
            }
        }

        return detailsPass;

    }

    public static int calculateDetailsNoPass(List<ReviewStandard> standards, Map<Long, ReviewDetailsResult> resultMap) {

        int detailsNoPass = 0;

        for(ReviewStandard standard : standards) {
            List<ReviewDetails> details = getDetailsByStandard(standard);
            for(ReviewDetails reviewDetails : details) {

                if(Objects.equals(detailsIsPass(reviewDetails, resultMap), ReviewStandard.NO_PASSED)) {
                    detailsNoPass = detailsNoPass + 1;
                }
            }
        }

        return detailsNoPass;

    }

    public static List<ReviewDetails> getDetailsByStandard(ReviewStandard standard) {

        List<ReviewDetails> details = new ArrayList();

        List<ReviewKeyPoint> keyPointList = standard.getKeyPointList();
        for(ReviewKeyPoint keyPoint : keyPointList) {
            details.addAll(keyPoint.getReviewDetailsList());
        }

        return details;
    }

    public static Integer detailsIsPass(ReviewDetails reviewDetails, Map<Long, ReviewDetailsResult> resultMap) {
        ReviewDetailsResult result = resultMap.get(reviewDetails.getId());

        if(result == null) {
            return null;
        }

        return result.getPassed();
    }
}