package com.yunyan.business.document.y22;

import com.yunyan.business.document.y22.pojo.finalExcelY22.*;
import com.yunyan.business.document.y23.finalData.FinalY23Utils;
import com.yunyan.business.document.y23.finalData.pojo.ChangeValueItemVo;
import com.yunyan.business.domain.CourseCode;
import com.yunyan.common.exception.ServiceException;
import com.yunyan.common.utils.StringUtils;
import lombok.extern.slf4j.Slf4j;

import java.util.List;
import java.util.Objects;
import java.util.Optional;

/**
 * 更新 决算 填报的信息
 */
@Slf4j
public class UpdateReportFinalData {


    /**
     * 更新 填报的信息
     * @param dataVo
     * @param updateVo
     */
    public static void updateFillData(FinalExcelDataVo dataVo, FinalExcelDataVo updateVo) {
        //更新 p3t1
        updateP3T1(dataVo.getP3T1Vo(), updateVo.getP3T1Vo());

        //更新 p3t2
        updateP3T2(dataVo.getP3T2Vo(), updateVo.getP3T2Vo());
        updateP3T2ListItem(dataVo.getP3T2Vo().getList(), updateVo.getP3T2Vo().getList());
        updateP3T2SubListItem(dataVo.getP3T2Vo().getSubItemList(), updateVo.getP3T2Vo().getSubItemList());

        //更新 p3t3
        updateP3T3ListItem(dataVo.getP3T3Vo().getList(), updateVo.getP3T3Vo().getList());

        //更新 p3t4
        updateP3T4(dataVo.getP3T4Vo(), updateVo.getP3T4Vo());
        updateP3T4ListItem(dataVo.getP3T4Vo().getList(), updateVo.getP3T4Vo().getList());

        //更新 p3t5
        updateP3T5(dataVo.getP3T5Vo(), updateVo.getP3T5Vo());

        //更新 p3t6
        updateP3T6(dataVo.getP3T6Vo(), updateVo.getP3T6Vo());

        //更新 p3t7
        updateP3T7(dataVo.getP3T7Vo(), updateVo.getP3T7Vo());

        //更新 p3t8
        updateP3T8(dataVo.getP3T8Vo(), updateVo.getP3T8Vo());
    }

    /**
     * 更新 p3t1部分
     * @param oldData
     * @param updateData
     */
    private static void updateP3T1(FinalP3T1Vo oldData, FinalP3T1Vo updateData) {
        updateP3T1ListItem(oldData.getIncome().getList(), updateData.getIncome().getList());
        updateP3T1ListItem(oldData.getExpenditure().getList(), updateData.getExpenditure().getList());
    }

    /**
     * 更新 p3t1部分的 item
     * @param list
     * @param updateList
     */
    private static void updateP3T1ListItem(List<FinalP3T1TotalItemVo> list, List<FinalP3T1TotalItemVo> updateList) {
        if(list.isEmpty()) {
            log.error("修改时, 第三部分的第一点的 list为空");
            return;
        }

        int index = 0;
        for (FinalP3T1TotalItemVo item : list) {
            if(updateList.size() > index ) {
                item.setReason(updateList.get(index).getReason());
                item.setInfoDesc(updateList.get(index).getInfoDesc());
            }
            index++;
        }
    }

    /**
     * 更新 p3t2的  部分
     * @param p3T2Vo
     * @param updateData
     */
    private static void updateP3T2(FinalP3T2Vo p3T2Vo, FinalP3T2Vo updateData) {
        p3T2Vo.setExpenditureReason(updateData.getExpenditureReason());
    }


    /**
     * 更新 p3t2的 item 部分
     * @param list
     * @param updateList
     */
    private static void updateP3T2ListItem(List<FinalP3T2CategoryItemVo> list, List<FinalP3T2CategoryItemVo> updateList) {
        if(Objects.isNull(list) || list.isEmpty() || Objects.isNull(updateList) || updateList.isEmpty()) {
            log.error("修改时, 第三部分的第一点的 list为空");
            return;
        }

        //有的模板会没有
        if(list.size() != updateList.size()) {
            log.error("第三大部分的 第二部分的修改数据集合大小不一致, 请联系管理员~");
            return;
            //throw new ServiceException("第三大部分的第二部分的修改数据集合大小不一致, 请联系管理员~");
        }

        List<FinalP3T2CategoryItemVo> p3T2CategoryList = list;
        int indexCategory = 0;
        for (FinalP3T2CategoryItemVo categoryItemVo : p3T2CategoryList) {
            List<FinalP3T2ItemVo> p3T2ItemList = categoryItemVo.getList();
            List<FinalP3T2ItemVo> p3T2ItemUpdateList = updateList.get(indexCategory).getList();

            //新加的budgetReason
            categoryItemVo.setBudgetReason(updateList.get(indexCategory).getBudgetReason());

            indexCategory++;
            if(p3T2ItemList.isEmpty()) {
                continue;
            }

            if(p3T2ItemList.size() != p3T2ItemUpdateList.size()) {
                log.error("第三大部分的 第二部分的小项修改的数据集合大小不一致, 请联系管理员~");
                continue;
                //throw new ServiceException("第三大部分的 第二部分的小项修改的数据集合大小不一致, 请联系管理员~");
            }

            int index = 0;
            for (FinalP3T2ItemVo item : p3T2ItemList) {
                if(p3T2ItemUpdateList.size() > index ) {
                    item.setReason(p3T2ItemUpdateList.get(index).getReason());
                    item.setUsage(p3T2ItemUpdateList.get(index).getUsage());
                }
                index++;
            }
        }
    }

    /**
     * 更新 p3t2的 sub item 部分
     * @param list
     * @param updateList
     */
    private static void updateP3T2SubListItem(List<FinalP3T2ItemVo> list, List<FinalP3T2ItemVo> updateList) {
        if(Objects.isNull(list) || list.isEmpty() || Objects.isNull(updateList) || updateList.isEmpty()) {
            log.error("修改时, 第三部分的第2点的 sub list为空");
            return;
        }

        if(list.size() != updateList.size()) {
            log.error("第三大部分的 第二部分的类款项修改的数据集合大小不一致, 请联系管理员~");
            throw new ServiceException("第三大部分的 第二部分的类款项修改的数据集合大小不一致, 请联系管理员~");
        }

        int index = 0;
        for (FinalP3T2ItemVo item : list) {
            if(updateList.size() > index ) {
                item.setReason(updateList.get(index).getReason());
                item.setUsage(updateList.get(index).getUsage());
            }
            index++;
        }
    }

    /**
     * 更新 p3t3的 item 部分
     * @param list
     * @param updateList
     */
    private static void updateP3T3ListItem(List<FinalP3T3ItemVo> list, List<FinalP3T3ItemVo> updateList) {
        if(Objects.isNull(list) || list.isEmpty() || Objects.isNull(updateList) || updateList.isEmpty()) {
            log.error("修改时, 第三部分的第一点的 list为空");
            return;
        }

        int index = 0;
        for (FinalP3T3ItemVo item : list) {
            if(updateList.size() > index ) {
                item.setReason(updateList.get(index).getReason());
                item.setUsage(updateList.get(index).getUsage());
            }
            index++;
        }
    }

    private static void updateP3T4(FinalP3T4Vo oldData, FinalP3T4Vo updateData) {
        // 更新 reason usge
        oldData.setExpenditureBudgetReason(updateData.getExpenditureBudgetReason());
        oldData.setExpenditureBudgetUsage(updateData.getExpenditureBudgetUsage());
    }

    /**
     * 更新 p3t4的 item 部分
     * @param list
     * @param updateList
     */
    private static void updateP3T4ListItem(List<FinalP3T4CategoryItemVo> list, List<FinalP3T4CategoryItemVo> updateList) {
        if(list.isEmpty()) {
            log.error("修改时, 第三部分的第四点的 list为空");
            return;
        }

        if(list.size() != updateList.size()) {
            log.error("第三大部分的 第四部分的修改数据集合大小不一致, 请联系管理员~");
            throw new ServiceException("第三大部分的第四部分的修改数据集合大小不一致, 请联系管理员~");
        }

        List<FinalP3T4CategoryItemVo> p3T2CategoryList = list;
        int indexCategory = 0;
        for (FinalP3T4CategoryItemVo categoryItemVo : p3T2CategoryList) {
            //设置 reason
            categoryItemVo.setReason(updateList.get(indexCategory).getReason());

            List<FinalP3T4ItemVo> p3T4ItemList = categoryItemVo.getList();
            List<FinalP3T4ItemVo> p3T4ItemUpdateList = updateList.get(indexCategory).getList();
            indexCategory++;
            if( null == p3T4ItemList || null == p3T4ItemUpdateList || p3T4ItemList.isEmpty() || p3T4ItemUpdateList.isEmpty()) {
                continue;
            }

            if(p3T4ItemList.size() != p3T4ItemUpdateList.size()) {
                log.error("第三大部分的 第四部分的小项修改的数据集合大小不一致, 请联系管理员~");
                throw new ServiceException("第三大部分的 第四部分的小项修改的数据集合大小不一致, 请联系管理员~");
            }

            int index = 0;
            for (FinalP3T4ItemVo item : p3T4ItemList) {
                if(p3T4ItemUpdateList.size() > index ) {
                    item.setReason(p3T4ItemUpdateList.get(index).getReason());
                    item.setUsage(p3T4ItemUpdateList.get(index).getUsage());
                }
                index++;
            }
        }


    }

    /**
     * 更新 p3t5的
     * @param oldData
     * @param updateData
     */
    private static void updateP3T5(FinalP3T5Vo oldData, FinalP3T5Vo updateData) {
        // 更新 item
        updateP3T5ListItem(oldData.getList(), updateData.getList());
    }

    /**
     * 更新 p3t5的 item 部分
     * @param list
     * @param updateList
     */
    private static void updateP3T5ListItem(List<FinalP3T5CategoryItemVo> list, List<FinalP3T5CategoryItemVo> updateList) {
        if(list.isEmpty()) {
            log.error("修改时, 第三部分的第五点的 list为空");
            return;
        }

        if(list.size() != updateList.size()) {
            log.error("第三大部分的 第五部分的修改数据集合大小不一致, 请联系管理员~");
            throw new ServiceException("第三大部分的第五部分的修改数据集合大小不一致, 请联系管理员~");
        }

        List<FinalP3T5CategoryItemVo> p3T5CategoryList = list;
        int indexCategory = 0;
        for (FinalP3T5CategoryItemVo categoryItemVo : p3T5CategoryList) {
            List<FinalP3T5ItemVo> p3T5ItemList = categoryItemVo.getList();
            List<FinalP3T5ItemVo> p3T5ItemUpdateList = updateList.get(indexCategory).getList();
            indexCategory++;
            if( null == p3T5ItemList || null == p3T5ItemUpdateList || p3T5ItemList.isEmpty() || p3T5ItemUpdateList.isEmpty()) {
                continue;
            }

            if(p3T5ItemList.size() != p3T5ItemUpdateList.size()) {
                log.error("第三大部分的 第五部分的小项修改的数据集合大小不一致, 请联系管理员~");
                throw new ServiceException("第三大部分的 第五部分的小项修改的数据集合大小不一致, 请联系管理员~");
            }

            int index = 0;
            for (FinalP3T5ItemVo item : p3T5ItemList) {
                if(p3T5ItemUpdateList.size() > index ) {
                    item.setReason(p3T5ItemUpdateList.get(index).getReason());
                    item.setUsage(p3T5ItemUpdateList.get(index).getUsage());
                }
                index++;
            }
        }


    }


    /**
     * 更新 p3t6的
     * @param oldData
     * @param updateData
     */
    private static void updateP3T6(FinalP3T6Vo oldData, FinalP3T6Vo updateData) {
        //原因
        oldData.setReason(updateData.getReason());
        //原因2 凭祥p6第四段新加
        oldData.setExpenditureChangeReason(updateData.getExpenditureChangeReason());
        oldData.setBudgetReason(updateData.getBudgetReason());

        //因公出镜
        oldData.getAbroadVo().setReason(updateData.getAbroadVo().getReason());
        oldData.getAbroadVo().setDeptNameStr(updateData.getAbroadVo().getDeptNameStr());
        oldData.getAbroadVo().setDeptBelongNum(updateData.getAbroadVo().getDeptBelongNum());
        oldData.getAbroadVo().setDeptBelonGroupgNum(updateData.getAbroadVo().getDeptBelonGroupgNum());
        //oldData.getAbroadVo().setDeptGroupNum(updateData.getAbroadVo().getDeptGroupNum());
        oldData.getAbroadVo().setDeptOtherNum(updateData.getAbroadVo().getDeptOtherNum());
        oldData.getAbroadVo().setExpenditureContent(updateData.getAbroadVo().getExpenditureContent());

        //公务用车购置及运行费支出具体
        oldData.getCarVo().setCarReason(updateData.getCarVo().getCarReason());
        oldData.getCarVo().setBudgetReason(updateData.getCarVo().getBudgetReason());
        oldData.getCarVo().setCarBuyReason(updateData.getCarVo().getCarBuyReason());
        oldData.getCarVo().setCarBuyNum(updateData.getCarVo().getCarBuyNum());
        oldData.getCarVo().setCarBuyFor(updateData.getCarVo().getCarBuyFor());
        oldData.getCarVo().setCarOperateReason(updateData.getCarVo().getCarOperateReason());
        oldData.getCarVo().setCarOperateFor(updateData.getCarVo().getCarOperateFor());
        //oldData.getCarVo().setDeptNameStr(updateData.getCarVo().getDeptNameStr());
        //保有量不更新
        //oldData.getCarVo().setCarNum(updateData.getCarVo().getCarNum());
        /*oldData.getCarVo().setCarOperateYear(updateData.getCarVo().getCarOperateYear());
        oldData.getCarVo().setCarOperateEach(updateData.getCarVo().getCarOperateEach());*/

        //公务接待费支出具体
        oldData.getReceptiondVo().setReason(updateData.getReceptiondVo().getReason());
    }

    /**
     * 更新 p3t7的
     * @param oldData
     * @param updateData
     */
    private static void updateP3T7(FinalP3T7Vo oldData, FinalP3T7Vo updateData) {

        //(输入)预算绩效管理工作开展情况
        //oldData.setPerformance(updateData.getPerformance());

        //机关运行经费支出情况说明
        if(StringUtils.isNotBlank(updateData.getDeptOperateVo().getTotal())) {
            oldData.getDeptOperateVo().setTotal(updateData.getDeptOperateVo().getTotal());
        }
        if(StringUtils.isNotBlank(updateData.getDeptOperateVo().getBegin())) {
            oldData.getDeptOperateVo().setBegin(updateData.getDeptOperateVo().getBegin());
        }
        if(StringUtils.isNotBlank(updateData.getDeptOperateVo().getBeginRatio())) {
            oldData.getDeptOperateVo().setBeginRatio(updateData.getDeptOperateVo().getBeginRatio());
        }
        //设置 比较的
        if(!Objects.isNull(updateData.getDeptOperateVo().getChangeItemVo()) && !Objects.isNull(oldData.getDeptOperateVo().getChangeItemVo())) {
            oldData.getDeptOperateVo().getChangeItemVo().setChangeAmountWord(updateData.getDeptOperateVo().getChangeItemVo().getChangeAmountWord());
            oldData.getDeptOperateVo().getChangeItemVo().setChangeAmount(updateData.getDeptOperateVo().getChangeItemVo().getChangeAmount());
            oldData.getDeptOperateVo().getChangeItemVo().setChangeRatioWord(updateData.getDeptOperateVo().getChangeItemVo().getChangeRatioWord());
            oldData.getDeptOperateVo().getChangeItemVo().setChangeRatio(updateData.getDeptOperateVo().getChangeItemVo().getChangeRatio());
        } else {
            ChangeValueItemVo changeItemVo = FinalY23Utils.getChangeItemVo( oldData.getDeptOperateVo().getTotal(), oldData.getDeptOperateVo().getBegin());
            oldData.getDeptOperateVo().setChangeItemVo(changeItemVo);
        }
        oldData.getDeptOperateVo().setCompareBeginAmountStr(updateData.getDeptOperateVo().getCompareBeginAmountStr());
        oldData.getDeptOperateVo().setCompareBeginRatioStr(updateData.getDeptOperateVo().getCompareBeginRatioStr());
        oldData.getDeptOperateVo().setBeginReason(updateData.getDeptOperateVo().getBeginReason());
        oldData.getDeptOperateVo().setLastYearReason(updateData.getDeptOperateVo().getLastYearReason());
        if(!Objects.isNull(oldData.getDeptOperateVo()) && !Objects.isNull(updateData.getDeptOperateVo()) && !Objects.isNull(updateData.getDeptOperateVo().getFillFlag())) {
            oldData.getDeptOperateVo().setFillFlag(updateData.getDeptOperateVo().getFillFlag());
        }
        //平南的 设置 更新 运行经费与年初预算时, 更新
        if(StringUtils.isNotBlank(oldData.getDeptOperateVo().getTotal()) && StringUtils.isNotBlank(oldData.getDeptOperateVo().getLastYear())  ) {
            oldData.getDeptOperateVo().setCompareLastYearStr(FinalY23Utils.getAddOrSubStringP3t7s1(oldData.getDeptOperateVo().getTotal(), oldData.getDeptOperateVo().getLastYear()));
        }


        //政府采购支出情况说明
        if(!Objects.isNull(oldData.getGovBuyVo()) && !Objects.isNull(updateData.getGovBuyVo()) && !Objects.isNull(updateData.getGovBuyVo().getFillFlag())) {
            oldData.getGovBuyVo().setFillFlag(updateData.getGovBuyVo().getFillFlag());
        }
        if(!Objects.isNull(oldData.getGovBuyVo()) && !Objects.isNull(updateData.getGovBuyVo())) {
            if (StringUtils.isNotBlank(updateData.getGovBuyVo().getSmallRatio())) {
                oldData.getGovBuyVo().setSmallRatio(updateData.getGovBuyVo().getSmallRatio());
            }
            if (StringUtils.isNotBlank(updateData.getGovBuyVo().getProductRatio())) {
                oldData.getGovBuyVo().setProductRatio(updateData.getGovBuyVo().getProductRatio());
            }
            if (StringUtils.isNotBlank(updateData.getGovBuyVo().getProjectRatio())) {
                oldData.getGovBuyVo().setProjectRatio(updateData.getGovBuyVo().getProjectRatio());
            }
            if (StringUtils.isNotBlank(updateData.getGovBuyVo().getServiceRatio())) {
                oldData.getGovBuyVo().setServiceRatio(updateData.getGovBuyVo().getServiceRatio());
            }
        }


        //国有资产占用情况说明
        oldData.getAssetVo().setCarOtherStr(updateData.getAssetVo().getCarOtherStr());
        oldData.getAssetVo().setDeviceStr50(updateData.getAssetVo().getDeviceStr50());
        oldData.getAssetVo().setDeviceStr100(updateData.getAssetVo().getDeviceStr100());
    }

    /**
     * 更新 p3t8的
     * @param oldData
     * @param updateData
     */
    private static void updateP3T8(FinalP3T8Vo oldData, FinalP3T8Vo updateData) {
        if(null == updateData) {
            return;
        }

        //(输入)预算绩效管理工作开展情况
        oldData.setPerformance(updateData.getPerformance());
        oldData.setPerformance2(updateData.getPerformance2());
        oldData.setPerformance3(updateData.getPerformance3());
        oldData.setPerformanceJson(updateData.getPerformanceJson());
        //部门决算中项目绩效自评结果
        oldData.setAssessment(updateData.getAssessment());
        oldData.setAssessmentJson(updateData.getAssessmentJson());
        //部门决算中项目绩效自评结果 2
        oldData.setAssessment2(updateData.getAssessment2());
        oldData.setAssessment2Json(updateData.getAssessment2Json());
        //所有项目均开展了绩效自评 第一段的第二小段 2
        oldData.setAssessment102(updateData.getAssessment102());
        oldData.setAssessment103(updateData.getAssessment103());

        //凭祥 p3
        oldData.setP3DeptAssessment(updateData.getP3DeptAssessment());
        oldData.setP3DeptAssessmentJson(updateData.getP3DeptAssessmentJson());
        //凭祥 p4
        oldData.setP4FinancialAssessment(updateData.getP4FinancialAssessment());
        oldData.setP4FinancialAssessmentJson(updateData.getP4FinancialAssessmentJson());

        //新加的 标记, 自评
        oldData.setP1Flag(updateData.getP1Flag());
        oldData.setP2Flag(updateData.getP2Flag());
        if(!Objects.isNull(updateData.getP2ProjectFlag())) {
            oldData.setP2ProjectFlag(updateData.getP2ProjectFlag());
        }
        oldData.setP3Flag(updateData.getP3Flag());
        oldData.setP4Flag(updateData.getP4Flag());
        oldData.setBsP2List(updateData.getBsP2List());
        //凭祥 的 p2 项目list
        oldData.setP2ProjectList(updateData.getP2ProjectList());

    }

    /**
     * 设置 第二部分的表6的编码,  p3p3的编码
     * @param finalExcelDataVo
     * @param codeList
     */
    public static void updateCourseCode(FinalExcelDataVo finalExcelDataVo, List<CourseCode> codeList) {
        //设置表6的编码
        setT6Code(finalExcelDataVo.getT6VZ08S1Vo().getList(), codeList);
        //设置 p3p3部分的款级
        setP3P3Code(finalExcelDataVo.getP3T3Vo().getList(), codeList);
    }

    /**
     * 设置表6的编码
     * @param list
     * @param codeList
     */
    private static void setT6Code(List<FinalZ08S1T6ItemVo> list, List<CourseCode> codeList) {
        if(list.isEmpty()) {
            return;
        }

        list.stream().forEach(i -> {
            //设置第一
            if(StringUtils.isNotBlank(i.getName1())) {
                //查重编码
                Optional<CourseCode> codeObj1 = codeList.stream().filter(item -> {return i.getName1().equals(item.getCourseName());}).findFirst();
                if(codeObj1.isPresent()) {
                    //设置编码
                    i.setCode1(codeObj1.get().getCourseCode());
                }
            }

            //第二
            if(StringUtils.isNotBlank(i.getName2())) {
                Optional<CourseCode> codeObj2 = codeList.stream().filter(item -> {return i.getName2().equals(item.getCourseName());}).findFirst();
                if(codeObj2.isPresent()) {
                    i.setCode2(codeObj2.get().getCourseCode());
                }
            }
        });

    }

    /**
     * 设置 p3p3的编码
     * @param list
     * @param codeList
     */
    private static void setP3P3Code(List<FinalP3T3ItemVo> list, List<CourseCode> codeList) {
        if(list.isEmpty()) {
            return;
        }

        list.stream().forEach(i -> {

            i.getList().stream().forEach(
                    it -> {
                        if(StringUtils.isNotBlank(it.getName())) {
                            //查重编码
                            Optional<CourseCode> codeObj1 = codeList.stream().filter(item -> {return it.getName().equals(item.getCourseName());}).findFirst();
                            if(codeObj1.isPresent()) {
                                //设置编码
                                it.setCode(codeObj1.get().getCourseCode());
                            }
                        }
                    }
            );
        });

        //设置 p3p3 的款级的显示 (编码 + 名称)
        ReadFinalExcelY22Utils.setP3p3ItmeParagraphStr(list);
    }

    /**
     * 替换掉 文字, 去掉 开头的 广西
     * @param source
     * @param targetSrc 广西
     * @param replaceStr
     * @return
     */
    public static String replaceStartIndexStr(String source, String targetSrc, String replaceStr) {
        if(StringUtils.isBlank(source)) {
            return source;
        }

        if(source.startsWith(targetSrc)) {
            String newStr = source.replaceFirst(targetSrc, replaceStr);
            return newStr;
        }

        return source;
    }

}
