package com.tofly.feesapi.sfgl.entity.vo;

import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.util.ObjUtil;
import cn.hutool.core.util.StrUtil;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.tofly.feesapi.common.MoneySerializer;
import com.tofly.feesapi.common.util.SysConstant;
import com.tofly.feesapi.sfgl.entity.dto.YjcyjFffsStat;
import com.tofly.feesapi.sfgl.entity.dto.YyFjFffsStat;
import com.tofly.feesapi.sfgl.entity.dto.YySjFffsStat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

@ApiModel(value = "日收费统计VO", description = "日收费统计")
@Data
@NoArgsConstructor
@AllArgsConstructor
public class YySspjxxDailyStat {

    @ApiModelProperty(value = "水费收入", position = 1)
    private List<SrxmStat> sfsr;

    @ApiModelProperty(value = "附加及代收费(预交、冲预交)", position = 2)
    private List<SrxmStat> fjjdsf;

    @ApiModelProperty(value = "总计", position = 3)
    private SrxmStat zj;

    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    @ApiModel(value = "收入项目统计VO", description = "日收费统计")
    public static class SrxmStat {

        @ApiModelProperty(value = "收入项目", position = 2)
        private String srxm;

        @ApiModelProperty(value = "付费方式统计", position = 3)
        private List<FffsStat> fffsStats;
    }

    @ApiModel(value = "付费方式统计VO", description = "日收费统计")
    @NoArgsConstructor
    @AllArgsConstructor
    @Data
    public static class FffsStat {

        @ApiModelProperty(value = "付费方式名称", position = 1)
        private String fffsmc;

        @ApiModelProperty(value = "水量", position = 1)
        private BigDecimal sl = BigDecimal.ZERO;

        @ApiModelProperty(value = "金额", position = 2)
        @JsonSerialize(using = MoneySerializer.class)
        private BigDecimal je = BigDecimal.ZERO;

        public static List<FffsStat> buildByFffstjMap(Map<String, List<YySjFffsStat>> fffstjMap, Map<String, String> fffsMap) {
            List<FffsStat> fffsStats = new ArrayList<>();
            for (Map.Entry<String, List<YySjFffsStat>> entry : fffstjMap.entrySet()) {
                String fffsbm = entry.getKey();
                if (StrUtil.isEmpty(fffsbm)) {
                    continue;
                }
                // 莱阳目前仅针对现金、转账、POS机、第三方代收、预存扣款(系统自动扣减方式)
                if (!SysConstant.SFRJBB_MRFFFS.contains(fffsbm)) {
                    continue;
                }

                List<YySjFffsStat> tjlist = entry.getValue();
                String fffsmc = fffsMap.get(fffsbm);
                if (fffsbm.equalsIgnoreCase("9")) {
                    fffsmc = SysConstant.BBTJ_FFFS_YCKK;
                }
                //将电汇转换为转账
                if (fffsbm.equalsIgnoreCase("10")) {
                    fffsmc = SysConstant.BBTJ_FFFS_ZZ;
                }
                FffsStat fffsStat = new FffsStat();
                fffsStat.setFffsmc(fffsmc);
                BigDecimal sl = tjlist.stream().filter(o -> ObjUtil.isNotNull(o.getSl())).map(YySjFffsStat::getSl).reduce(BigDecimal.ZERO, BigDecimal::add);
                fffsStat.setSl(sl);

                BigDecimal je = tjlist.stream().filter(o -> ObjUtil.isNotNull(o.getSf())).map(YySjFffsStat::getSf).reduce(BigDecimal.ZERO, BigDecimal::add);
                fffsStat.setJe(je);
                fffsStats.add(fffsStat);
            }
            //转账
            List<FffsStat> fffs_zz;
            fffs_zz = fffsStats.stream().filter(o -> o.getFffsmc().equalsIgnoreCase(SysConstant.BBTJ_FFFS_ZZ)).collect(Collectors.toList());
            if (fffs_zz.size() > 0) {
                fffsStats.removeIf(o -> o.getFffsmc().equalsIgnoreCase(SysConstant.BBTJ_FFFS_ZZ));
                BigDecimal sl = fffs_zz.stream().filter(o -> ObjUtil.isNotNull(o.getSl())).map(FffsStat::getSl).reduce(BigDecimal.ZERO, BigDecimal::add);
                BigDecimal je = fffs_zz.stream().filter(o -> ObjUtil.isNotNull(o.getJe())).map(FffsStat::getJe).reduce(BigDecimal.ZERO, BigDecimal::add);
                fffsStats.add(new FffsStat(SysConstant.BBTJ_FFFS_ZZ, sl, je));
            }
            return fffsStats;
        }

        public static List<FffsStat> buildByFffsYjMap(Map<String, List<YjcyjFffsStat>> fffsYjMap, Map<String, String> fffsMap) {
            List<FffsStat> fffsStats = new ArrayList<>();

            for (Map.Entry<String, List<YjcyjFffsStat>> entry : fffsYjMap.entrySet()) {
                String fffsbm = entry.getKey();
                if (StrUtil.isEmpty(fffsbm)) {
                    continue;
                }
                // 账户预交付费方式：现金、转账、POS机、第三方代收
                if (!SysConstant.SFRJBB_YJJEFFFS.contains(fffsbm)) {
                    continue;
                }

                FffsStat fffsStat = new FffsStat();
                String fffsmc = fffsMap.get(fffsbm);
                //将电汇转换为转账
                if (fffsbm.equalsIgnoreCase("10")) {
                    fffsmc = SysConstant.BBTJ_FFFS_ZZ;
                }
                fffsStat.setFffsmc(fffsmc);

                List<YjcyjFffsStat> tjlist = entry.getValue();
                BigDecimal sszje = tjlist.stream().filter(o -> ObjUtil.isNotNull(o.getSszje())).map(YjcyjFffsStat::getSszje)
                        .reduce(BigDecimal.ZERO, BigDecimal::add);
                fffsStat.setJe(sszje);
                fffsStats.add(fffsStat);
            }
            //转账
            List<FffsStat> fffs_zz;
            fffs_zz = fffsStats.stream().filter(o -> o.getFffsmc().equalsIgnoreCase(SysConstant.BBTJ_FFFS_ZZ)).collect(Collectors.toList());
            if (fffs_zz.size() > 0) {
                fffsStats.removeIf(o -> o.getFffsmc().equalsIgnoreCase(SysConstant.BBTJ_FFFS_ZZ));
                BigDecimal sl = fffs_zz.stream().filter(o -> ObjUtil.isNotNull(o.getSl())).map(FffsStat::getSl).reduce(BigDecimal.ZERO, BigDecimal::add);
                BigDecimal je = fffs_zz.stream().filter(o -> ObjUtil.isNotNull(o.getJe())).map(FffsStat::getJe).reduce(BigDecimal.ZERO, BigDecimal::add);
                fffsStats.add(new FffsStat(SysConstant.BBTJ_FFFS_ZZ, sl, je));
            }
            return fffsStats;
        }

        public static List<FffsStat> buildByFffsCyjMap(Map<String, List<YjcyjFffsStat>> fffsYjMap, Map<String, String> fffsMap) {
            List<FffsStat> fffsStats = new ArrayList<>();

            for (Map.Entry<String, List<YjcyjFffsStat>> entry : fffsYjMap.entrySet()) {
                String fffsbm = entry.getKey();
                if (StrUtil.isEmpty(fffsbm)) {
                    continue;
                }

                // 冲预交付费方式：现金、转账、POS机、第三方代收、系统自动扣减
                if (!SysConstant.SFRJBB_MRFFFS.contains(fffsbm)) {
                    continue;
                }

                FffsStat fffsStat = new FffsStat();
                String fffsmc = fffsMap.get(fffsbm);
                //将电汇转换为转账
                if (fffsbm.equalsIgnoreCase("10")) {
                    fffsmc = SysConstant.BBTJ_FFFS_ZZ;
                }
                fffsStat.setFffsmc(fffsmc);

                List<YjcyjFffsStat> tjlist = entry.getValue();
                BigDecimal je = tjlist.stream().filter(o -> ObjUtil.isNotNull(o.getBckj())).map(YjcyjFffsStat::getBckj)
                        .reduce(BigDecimal.ZERO, BigDecimal::add);
                fffsStat.setJe(je);

                BigDecimal sl = tjlist.stream().filter(o -> ObjUtil.isNotNull(o.getBckj())).map(YjcyjFffsStat::getBckj)
                        .reduce(BigDecimal.ZERO, BigDecimal::add);


                fffsStats.add(fffsStat);
            }
            //转账
            List<FffsStat> fffs_zz;
            fffs_zz = fffsStats.stream().filter(o -> o.getFffsmc().equalsIgnoreCase(SysConstant.BBTJ_FFFS_ZZ)).collect(Collectors.toList());
            if (fffs_zz.size() > 0) {
                fffsStats.removeIf(o -> o.getFffsmc().equalsIgnoreCase(SysConstant.BBTJ_FFFS_ZZ));
                BigDecimal sl = fffs_zz.stream().filter(o -> ObjUtil.isNotNull(o.getSl())).map(FffsStat::getSl).reduce(BigDecimal.ZERO, BigDecimal::add);
                BigDecimal je = fffs_zz.stream().filter(o -> ObjUtil.isNotNull(o.getJe())).map(FffsStat::getJe).reduce(BigDecimal.ZERO, BigDecimal::add);
                fffsStats.add(new FffsStat(SysConstant.BBTJ_FFFS_ZZ, sl, je));
            }
            return fffsStats;
        }
    }
}
