package com.rongwei.bscommon.sys.service.impl;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.rongwei.bscommon.sys.dao.SrmIssuesListDao;
import com.rongwei.bscommon.sys.service.IssuesReportService;
import com.rongwei.bsentity.domin.SrmIssuesListDo;
import com.rongwei.bsentity.request.IssuesReportRequest;
import com.rongwei.bsentity.vo.SrmActionPlanVo;
import com.rongwei.bsentity.vo.SrmFormCountVo;
import com.rongwei.bsentity.vo.TimelyCompletionVo;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.function.Function;
import java.util.stream.Collectors;

/**
 * @author Trj
 */
@Service
public class IssuesReportServiceImpl extends ServiceImpl<SrmIssuesListDao,SrmIssuesListDo> implements IssuesReportService {



    /**
     * 落实行动计划
     */
    @Override
    public List<TimelyCompletionVo> actionPlanReport(IssuesReportRequest issuesReportRequest) {
        List<TimelyCompletionVo> timelyCompletionVos = new ArrayList<>();

        // 查询表单总数
       List<SrmFormCountVo> formCountVos = baseMapper.getFormCount(issuesReportRequest);


        // 查询行动计划中最晚实际完成时间
        List<SrmActionPlanVo> realEdDateVos = baseMapper.getMaxRealEdDate(issuesReportRequest);

        // 查询行动计划中最晚初始计划完成时间
        List<SrmActionPlanVo> planDateVos = baseMapper.getMaxTargetCompletionDate(issuesReportRequest);

//        // 非空判断
//        if (formCountVos.isEmpty()){
//            return timelyCompletionVos;
//        }
//
//        if (realEdDateVos.isEmpty()){
//            return timelyCompletionVos;
//        }
//
//        if (planDateVos.isEmpty()){
//            return timelyCompletionVos;
//        }

        // 报表数据生成
        return generateReport(formCountVos, realEdDateVos , planDateVos);
    }

    /**
     *
     * @param formCountVos  表单总数
     * @param realEdDateVos 最晚实际完成时间
     * @param planDateVos 最晚初始计划完成时间
     * @return List<TimelyCompletionVo> 各部门总数 完成  及时完成率
     */
    public List<TimelyCompletionVo> generateReport(List<SrmFormCountVo> formCountVos,
                                                    List<SrmActionPlanVo> realEdDateVos,
                                                    List<SrmActionPlanVo> planDateVos) {

        // 将 最晚实际完成时间 、 最晚初始计划完成时间  变成 Map
        Map<String, List<SrmActionPlanVo>> realEdMap = Optional.of(realEdDateVos).orElse(new ArrayList<>())
                .stream()
                .collect(Collectors.groupingBy(SrmActionPlanVo::getFullNameId));

        Map<String, List<SrmActionPlanVo>> planEdMap = Optional.of(planDateVos).orElse(new ArrayList<>())
                .stream()
                .collect(Collectors.groupingBy(SrmActionPlanVo::getFullNameId));

        // 计算完成数
        return computeOkCount(formCountVos,realEdMap,planEdMap);
    }


    /**
     * 计算完成数：
     * （1）、 按照车间划分
     * （2）、 如果 最晚实际完成时间 <=  最晚初始完成时间  ， 完成数加一
     *
     * @param formCountVos  各车间表单总数
     * @param realEdMap 各车间表单中最晚实际完成时间
     * @param planEdMap 各车间表单中最晚初始计划完成时间
     */
    public List<TimelyCompletionVo> computeOkCount(List<SrmFormCountVo> formCountVos,
                                                   Map<String, List<SrmActionPlanVo>> realEdMap,
                                                   Map<String, List<SrmActionPlanVo>> planEdMap) {

        List<TimelyCompletionVo> timelyCompletionVos = new ArrayList<>();

        if (formCountVos != null && !formCountVos.isEmpty() ){

            //根据车间分批计算
            for (SrmFormCountVo formCountVo : formCountVos) {

                TimelyCompletionVo timelyCompletionVo = new TimelyCompletionVo();
                timelyCompletionVo.setId(formCountVo.getOrgId());
                timelyCompletionVo.setFullName(formCountVo.getFullName());
                timelyCompletionVo.setCount(formCountVo.getCount());

                int count = 0;


                if ((realEdMap != null && !realEdMap.isEmpty()) && (planEdMap != null && !planEdMap.isEmpty())){

                    List<SrmActionPlanVo> realEdVos = realEdMap.get(formCountVo.getOrgId());
                    List<SrmActionPlanVo> planEdVos = planEdMap.get(formCountVo.getOrgId());

                    if ((realEdVos != null && !realEdVos.isEmpty()) && (planEdVos != null && !planEdVos.isEmpty()) ){

                        Map<String, SrmActionPlanVo> orgPlanEdMap = planEdVos.stream()
                                .collect(Collectors.toMap(SrmActionPlanVo::getId, Function.identity()));


                        // 各表单中行动计划的实际完成时间
                        for (SrmActionPlanVo realEdVo : realEdVos) {
                            SrmActionPlanVo orgPlanEdVo = orgPlanEdMap.get(realEdVo.getId());

                            // 计算完成数
                            // 最晚实际完成时间 <=  最晚初始完成时间  ， 完成数加一
                            if (orgPlanEdVo != null ){
                                if(realEdVo.getRealEdDate().compareTo(orgPlanEdVo.getTargetCompletionDate()) == -1 ||
                                        realEdVo.getRealEdDate().compareTo(orgPlanEdVo.getTargetCompletionDate()) == 0){
                                    count += 1 ;
                                }
                            }
                        }
                    }
                }

                timelyCompletionVo.setOkCount(count);
                timelyCompletionVos.add(timelyCompletionVo);
            }
            timelyCompletionVos.forEach(TimelyCompletionVo::init);
        }




        return timelyCompletionVos;
    }
}
