package com.zehong.system.service.impl;

import java.io.IOException;
import java.math.BigDecimal;
import java.net.URLEncoder;
import java.util.*;
import java.util.stream.Collectors;

import com.alibaba.excel.EasyExcel;
import com.zehong.common.core.domain.entity.SysRole;
import com.zehong.common.utils.DateUtils;
import com.zehong.common.utils.SecurityUtils;
import com.zehong.common.utils.StringUtils;
import com.zehong.system.config.easyexcel.CustomCellWriteHeightConfig;
import com.zehong.system.config.easyexcel.CustomCellWriteWidthConfig;
import com.zehong.system.domain.Statistics;
import com.zehong.system.domain.TSupBalUsgDay;
import com.zehong.system.domain.dto.TComplainDealDTO;
import com.zehong.system.domain.vo.ComplainDealSummaryAnalysisTableVo;
import com.zehong.system.domain.vo.SupBalGasSupSummaryAnalysisTableVo;
import com.zehong.system.mapper.TSupBalUsgDayMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.zehong.system.mapper.TSupBalGasSupMapper;
import com.zehong.system.domain.TSupBalGasSup;
import com.zehong.system.service.ITSupBalGasSupService;

import javax.servlet.http.HttpServletResponse;

/**
 * 供需平衡-气量监管Service业务层处理
 *
 * @author zehong
 * @date 2024-06-15
 */
@Service
public class TSupBalGasSupServiceImpl implements ITSupBalGasSupService
{
    @Autowired
    private TSupBalGasSupMapper tSupBalGasSupMapper;
    @Autowired
    private TSupBalUsgDayMapper tSupBalUsgDayMapper;

    /**
     * 查询供需平衡-气量监管
     *
     * @param fGasSupId 供需平衡-气量监管ID
     * @return 供需平衡-气量监管
     */
    @Override
    public TSupBalGasSup selectTSupBalGasSupById(Long fGasSupId)
    {
        return tSupBalGasSupMapper.selectTSupBalGasSupById(fGasSupId);
    }

    /**
     * 查询供需平衡-气量监管列表
     *
     * @param tSupBalGasSup 供需平衡-气量监管
     * @return 供需平衡-气量监管
     */
    @Override
    public List<TSupBalGasSup> selectTSupBalGasSupList(TSupBalGasSup tSupBalGasSup)
    {
        return tSupBalGasSupMapper.selectTSupBalGasSupList(tSupBalGasSup);
    }

    @Override
    public List<Statistics> tSupBalGasSupStatistics(List<String> sevenDate)
    {

        String companyInfoId = SecurityUtils.getLoginUser().getUser().getDeptId();
        if (!isQy()) {
            companyInfoId = null;
        }
        return tSupBalGasSupMapper.tSupBalGasSupStatistics(sevenDate,companyInfoId);
    }

    /**
     * 新增供需平衡-气量监管
     *
     * @param tSupBalGasSup 供需平衡-气量监管
     * @return 结果
     */
    @Override
    public int insertTSupBalGasSup(TSupBalGasSup tSupBalGasSup)
    {
        tSupBalGasSup.setCreateTime(DateUtils.getNowDate());
        tSupBalGasSup.setfSupDate(new Date());
        tSupBalGasSup.setfCompanyInfoId(SecurityUtils.getLoginUser().getUser().getDeptId());
        return tSupBalGasSupMapper.insertTSupBalGasSup(tSupBalGasSup);
    }

    /**
     * 修改供需平衡-气量监管
     *
     * @param tSupBalGasSup 供需平衡-气量监管
     * @return 结果
     */
    @Override
    public int updateTSupBalGasSup(TSupBalGasSup tSupBalGasSup)
    {
        tSupBalGasSup.setUpdateTime(DateUtils.getNowDate());
        return tSupBalGasSupMapper.updateTSupBalGasSup(tSupBalGasSup);
    }

    /**
     * 批量删除供需平衡-气量监管
     *
     * @param fGasSupIds 需要删除的供需平衡-气量监管ID
     * @return 结果
     */
    @Override
    public int deleteTSupBalGasSupByIds(Long[] fGasSupIds)
    {
        return tSupBalGasSupMapper.deleteTSupBalGasSupByIds(fGasSupIds);
    }

    /**
     * 删除供需平衡-气量监管信息
     *
     * @param fGasSupId 供需平衡-气量监管ID
     * @return 结果
     */
    @Override
    public int deleteTSupBalGasSupById(Long fGasSupId)
    {
        return tSupBalGasSupMapper.deleteTSupBalGasSupById(fGasSupId);
    }

     /**
     * 获取上报信息
     * @param companyId 企业id
     * @param calendarDate 上报时间
     * @return
     */
     @Override
     public TSupBalGasSup getReportInfoByCompany(String companyId, String calendarDate){
         Map<String,String> param = new HashMap();
         param.put("companyId",companyId);
         param.put("calendarDate",calendarDate);
         return tSupBalGasSupMapper.getReportInfoByCompany(param);
     }

    /**
     * 上传气量监管记录
     * @param fGasSupId 监管记录主键
     * @return
     */
    @Override
    public int reportSupBalGasSupRecInfo(Long fGasSupId) {
        TSupBalGasSup tSupBalGasSup = new TSupBalGasSup();
        tSupBalGasSup.setfGasSupId(fGasSupId);
        tSupBalGasSup.setfGovUploadTime(new Date());
        tSupBalGasSup.setfGovUploadStatus("1");
        return tSupBalGasSupMapper.updateTSupBalGasSup(tSupBalGasSup);
    }

    @Override
    public List<SupBalGasSupSummaryAnalysisTableVo> sentimentSummaryAnalysisMethodTableViews(SupBalGasSupSummaryAnalysisTableVo supBalGasSupSummaryAnalysisTableVo) {

        String date1 = supBalGasSupSummaryAnalysisTableVo.getDate();
        if(StringUtils.isEmpty(date1)) {
            return initEmptyList();
        }

        //查询当前年的开始时间和结束时间
        Date startOfMonth = DateUtils.parseDate(date1 + "-01-01 00:00:00");
        Date endOfMonth = DateUtils.parseDate(date1 + "-12-31 23:59:59");;
        String township = supBalGasSupSummaryAnalysisTableVo.getTownship();

        List<TSupBalGasSup> tSupBalGasSups = tSupBalGasSupMapper.queryAllByNotDeleteAndCreateTime(startOfMonth,endOfMonth,township);
        List<TSupBalUsgDay> tSupBalUsgDays = tSupBalUsgDayMapper.queryAllByNotDeleteAndCreateTime(startOfMonth,endOfMonth,township);
        //先初始化一个空的，然后再循环往里面放值
        List<SupBalGasSupSummaryAnalysisTableVo> supBalGasSupSummaryAnalysisTableVosEmpty = initEmptyList();
        //如果没数据，就返回一个都是null的数据的集合
        if(tSupBalGasSups.size() == 0 && tSupBalUsgDays.size() == 0) {
            return supBalGasSupSummaryAnalysisTableVosEmpty;
        }
        Map<String, List<TSupBalGasSup>> tSupBalGasSupsCollect = tSupBalGasSups.stream().collect(Collectors.groupingBy(TSupBalGasSup::getCreateTimeYear));
        Map<String, List<TSupBalUsgDay>> tSupBalUsgDaysCollect = tSupBalUsgDays.stream().collect(Collectors.groupingBy(TSupBalUsgDay::getCreateTimeYear));

        long supgasvolTotal = 0;
        long supgasuseTotal = 0;
        long liqgasvolTotal = 0;
        long liqgasuseTotal = 0;
        for (int i = 0; i < supBalGasSupSummaryAnalysisTableVosEmpty.size(); i++) {
            List<TSupBalGasSup> tSupBalGasSups1 = tSupBalGasSupsCollect.get(i+1+"");
            List<TSupBalUsgDay> tSupBalUsgDays1 = tSupBalUsgDaysCollect.get(i+1+"");
            long supgasvolNum = 0;
            long liqgasvolNum = 0;
            long supgasuseNum = 0;
            long liqgasuseNum = 0;
            if(tSupBalGasSups1 == null){
                supBalGasSupSummaryAnalysisTableVosEmpty.get(i).setSupgasvolNum("0");
                supBalGasSupSummaryAnalysisTableVosEmpty.get(i).setLiqgasvolNum("0");

            }else {
                supgasvolNum = tSupBalGasSupsCollect.get(i+1+"").stream().mapToLong(TSupBalGasSup::getfSupGasVol).sum();
                supgasvolTotal += supgasvolNum;
                supBalGasSupSummaryAnalysisTableVosEmpty.get(i).setSupgasvolNum(String.valueOf(supgasvolNum));

                liqgasvolNum = tSupBalGasSupsCollect.get(i+1+"").stream().mapToLong(TSupBalGasSup::getfSupGasYhq).sum();
                liqgasvolTotal += liqgasvolNum;
                supBalGasSupSummaryAnalysisTableVosEmpty.get(i).setLiqgasvolNum(String.valueOf(liqgasvolNum));
            }
            if(tSupBalUsgDays1 == null){
                supBalGasSupSummaryAnalysisTableVosEmpty.get(i).setSupgasuseNum("0");
                supBalGasSupSummaryAnalysisTableVosEmpty.get(i).setLiqgasuseNum("0");

            }else {
                supgasuseNum = tSupBalUsgDaysCollect.get(i+1+"").stream().mapToLong(TSupBalUsgDay::getfGasUsage).sum();
                supgasuseTotal += supgasuseNum;
                supBalGasSupSummaryAnalysisTableVosEmpty.get(i).setSupgasuseNum(String.valueOf(supgasuseNum));

                liqgasuseNum = tSupBalUsgDaysCollect.get(i+1+"").stream().mapToLong(TSupBalUsgDay::getfLpgUsage).sum();
                liqgasuseTotal += liqgasuseNum;
                supBalGasSupSummaryAnalysisTableVosEmpty.get(i).setLiqgasuseNum(String.valueOf(liqgasuseNum));
            }
            supBalGasSupSummaryAnalysisTableVosEmpty.get(i).setSupgasuseBalance(String.valueOf(supgasvolNum-supgasuseNum));

            supBalGasSupSummaryAnalysisTableVosEmpty.get(i).setLiqgasuseBalance(String.valueOf(liqgasvolNum-liqgasuseNum));
            //说明是 统计
            if (i == 12 ) {
                //supBalGasSupSummaryAnalysisTableVosEmpty.stream().mapToLong(SupBalGasSupSummaryAnalysisTableVo::getSupgasvolNum).sum()
                supBalGasSupSummaryAnalysisTableVosEmpty.get(i).setSupgasvolNum(String.valueOf(supgasvolTotal));
                supBalGasSupSummaryAnalysisTableVosEmpty.get(i).setSupgasuseNum(String.valueOf(supgasuseTotal));
                supBalGasSupSummaryAnalysisTableVosEmpty.get(i).setSupgasuseBalance(String.valueOf(supgasvolTotal-supgasuseTotal));

                supBalGasSupSummaryAnalysisTableVosEmpty.get(i).setLiqgasvolNum(String.valueOf(liqgasvolTotal));
                supBalGasSupSummaryAnalysisTableVosEmpty.get(i).setLiqgasuseNum(String.valueOf(liqgasuseTotal));
                supBalGasSupSummaryAnalysisTableVosEmpty.get(i).setLiqgasuseBalance(String.valueOf(liqgasvolTotal-liqgasuseTotal));
            }
        }
        return supBalGasSupSummaryAnalysisTableVosEmpty;
    }

    private List<SupBalGasSupSummaryAnalysisTableVo> initEmptyList() {
        List<SupBalGasSupSummaryAnalysisTableVo> supBalGasSupSummaryAnalysisTableVos = new ArrayList<>(13);
        SupBalGasSupSummaryAnalysisTableVo supBalGasSupSummaryAnalysisTableVo;
        for (int i = 0; i < 13; i++) {
            supBalGasSupSummaryAnalysisTableVo = new SupBalGasSupSummaryAnalysisTableVo();
            if (i <12) {
                supBalGasSupSummaryAnalysisTableVo.setDate((i + 1) + "月");
            } else {
                supBalGasSupSummaryAnalysisTableVo.setDate("统计");
            }
            supBalGasSupSummaryAnalysisTableVo.setLiqgasvolNum( null);
            supBalGasSupSummaryAnalysisTableVo.setLiqgasuseNum(null);
            supBalGasSupSummaryAnalysisTableVo.setLiqgasuseBalance(null);
            supBalGasSupSummaryAnalysisTableVo.setSupgasvolNum(null);
            supBalGasSupSummaryAnalysisTableVo.setSupgasuseNum(null);
            supBalGasSupSummaryAnalysisTableVo.setSupgasuseBalance(null);
            supBalGasSupSummaryAnalysisTableVos.add(supBalGasSupSummaryAnalysisTableVo);
        }
        return supBalGasSupSummaryAnalysisTableVos;
    }

    @Override
    public void sentimentSummaryAnalysisExport(HttpServletResponse response, SupBalGasSupSummaryAnalysisTableVo supBalGasSupSummaryAnalysisTableVo) throws IOException {
        List<SupBalGasSupSummaryAnalysisTableVo> supBalGasSupSummaryAnalysisTableVos = sentimentSummaryAnalysisMethodTableViews(supBalGasSupSummaryAnalysisTableVo);
        // 设置动态头
        String dynamicTitle = supBalGasSupSummaryAnalysisTableVo.getDynamicTitle();
        List<List<String>> headList = new ArrayList<>();
        List<String> head0 = new ArrayList<>();
        head0.add(dynamicTitle);
        head0.add("日期");
        List<String> head1 = new ArrayList<>();
        head1.add(dynamicTitle);
        head1.add("天然气供气量");
        List<String> head2 = new ArrayList<>();
        head2.add(dynamicTitle);
        head2.add("天然气用气量");
        List<String> head3 = new ArrayList<>();
        head3.add(dynamicTitle);
        head3.add("天然气供需差额");
        List<String> head4 = new ArrayList<>();
        head4.add(dynamicTitle);
        head4.add("液化气供气量");
        List<String> head5 = new ArrayList<>();
        head5.add(dynamicTitle);
        head5.add("液化气用气量");
        List<String> head6 = new ArrayList<>();
        head6.add(dynamicTitle);
        head6.add("液化气供需差额");
        headList.add(head0);
        headList.add(head1);
        headList.add(head2);
        headList.add(head3);
        headList.add(head4);
        headList.add(head5);
        headList.add(head6);

        List<List<Object>> dataList = supBalGasSupSummaryAnalysisTableVos.stream().map(vo -> {
            List<Object> objectList = new ArrayList<>();
            objectList.add(vo.getDate());
            objectList.add(vo.getSupgasvolNum());
            objectList.add(vo.getSupgasuseNum());
            objectList.add(vo.getSupgasuseBalance());
            objectList.add(vo.getLiqgasvolNum());
            objectList.add(vo.getLiqgasuseNum());
            objectList.add(vo.getLiqgasuseBalance());
            return objectList;
        }).collect(Collectors.toList());

        // 设置响应头
        response.setContentType("application/vnd.ms-excel");
        response.setCharacterEncoding("utf-8");
        // 设置防止中文名乱码
        String filename = URLEncoder.encode("供需平衡汇总分析", "utf-8");
        response.setHeader("content-disposition", "attachment;filename=" + filename + ".xlsx");

        // 先仅仅写入头，再以不写入头的方式写入数据
        EasyExcel.write(response.getOutputStream())
                .registerWriteHandler(new CustomCellWriteHeightConfig())
                .registerWriteHandler(new CustomCellWriteWidthConfig()).head(headList).sheet("供需平衡汇总分析列表").doWrite(dataList);
    }


    /**
     * 判断是否为政府角色
     * @return
     */
    private boolean isQy(){
        List<SysRole> roles = SecurityUtils.getLoginUser().getUser().getRoles();
        List<String> roleKeys = roles.stream().map(item -> item.getRoleKey()).collect(Collectors.toList());
        return roleKeys.contains("qy");
    }
}
