package com.zcxk.service;


import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.zcxk.dao.YearReportMapper;
import com.zcxk.dto.*;
import com.zcxk.entity.YearReportEntity;
import com.zcxk.model.LoginUser;
import com.zcxk.util.UserUtil;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.*;

/**
 * 日报Service接口
 *
 * @author: WYY
 * @date 2020-12-03 16:20
 */
@Service
public class YearReportService extends AbstractReportService<YearReportMapper, YearReportEntity> {

    @Resource
    private YearReportMapper yearReportMapper;

    /**
     * 查列表
     */
    public List<YearReportEntity> findList(YearReportEntity yearReportEntity) {
        return yearReportMapper.findList(yearReportEntity);
    }

    /**
     * 保存
     */
    public boolean addYearReport(YearReportEntity yearReport) {
        if (this.save(yearReport)) {
            return true;
        }
        return false;
    }


    /**
     * 根居ID获取对象
     */
    public YearReportEntity findYearReportById(Long id) {
        return yearReportMapper.findYearReportById(id);
    }

    public Page<ReportDto> findPage(IPage<ReportDto> page, Long[] ids, Integer year, Integer month, Integer day) {
        LoginUser currentUser = UserUtil.getCurrentUser();
        Page<ReportDto> reportPage = new Page<>();
        //查询场景下的所有设备信息
        List<DeviceDto> devices = new ArrayList<>();
        DeviceDto deviceDto = new DeviceDto();
        for (Long id : ids) {
            deviceDto.setSceneIds(sceneService.findByParentIdsLike(id));
            if (deviceDto.getSceneIds().size() > 0) {
                devices.addAll(deviceService.selectList(deviceDto));
            }
        }
        if(devices.size()>0) {
            YearReportEntity yearReportEntity = new YearReportEntity();
            yearReportEntity.setYear(year);
            yearReportEntity.setTenantId(currentUser.getTenantId());
            yearReportEntity.setParentSceneIds(ids);
            yearReportEntity.setDeviceIds(devices);
            reportPage = yearReportMapper.findPage(page, yearReportEntity);
            //查询标题
            ReportDto reportDto = new ReportDto();
            reportDto.setYear(year);
            reportDto.setDeviceIds(devices);
            reportDto.setParentSceneIds(ids);
            List<ReportAttributeDto> reportAttributeDtos2 = deviceParmService.findAttributeNameList(reportDto);
            List<String> dataTitle = new ArrayList<>();
            Map<String, Integer> mapsTitle = new LinkedHashMap<>();
            int numCount = 0;
            for (ReportAttributeDto title : reportAttributeDtos2) {
                dataTitle.add(title.getAttributeName());
                if (!mapsTitle.containsKey(title.getAttributeName())) {
                    mapsTitle.put(title.getAttributeName(), numCount++);
                }
            }
            //固定参数项
            List<ReportDto> reportDtos = yearReportMapper.findReport(reportDto);
            //单个属性值
            for (ReportDto item : reportPage.getRecords()) {
                item.setCollectDate(item.getYear() + "-" + String.format("%02d", item.getMonth()));
                item.setDeviceIds(devices);
                item.setDataTitle(dataTitle);
                //固定参数项
                calcUsage(item, reportDtos);

                //动态参数项
                List<ReportAttributeDto> reportAttributeDtos = yearReportMapper.findAttributeList(item);
                // item.setDataValues(reportAttributeDtos);
                Map<String, ReportAttributeDto> mapData = new LinkedHashMap<>();
                for (ReportAttributeDto itemData : reportAttributeDtos) {
                    if (!mapData.containsKey(itemData.getAttributeName())) {
                        mapData.put(itemData.getAttributeName(), itemData);
                    }
                }
                List<Map<String, Object>> maps = new ArrayList<>();
                for (String key : mapsTitle.keySet()) {
                    Map<String, Object> map = new LinkedHashMap<>();
                    map.put("attributeName", mapData.get(key) == null ? key : mapData.get(key).getAttributeName());
                    map.put("minValue" + mapsTitle.get(key), mapData.get(key) == null||mapData.get(key).getMinValue()==null ? "-" : (double)Math.round(mapData.get(key).getMinValue()*1000)/1000);
                    map.put("maxValue" + mapsTitle.get(key), mapData.get(key) == null||mapData.get(key).getMaxValue()==null ? "-" : (double)Math.round(mapData.get(key).getMaxValue()*1000)/1000);
                    map.put("avgValue" + mapsTitle.get(key), mapData.get(key) == null||mapData.get(key).getAvgValue()==null ? "-" : (double)Math.round(mapData.get(key).getAvgValue()*1000)/1000);
                    map.put("sumValue" + mapsTitle.get(key), mapData.get(key) == null||mapData.get(key).getSumValue()==null ? "-" : (double)Math.round(mapData.get(key).getSumValue()*1000)/1000);
                    map.put("latestValue" + mapsTitle.get(key), mapData.get(key) == null||mapData.get(key).getLatestValue()==null ? "-" : (double)Math.round(mapData.get(key).getLatestValue()*1000)/1000);
                    maps.add(map);
                }
                item.setDataMapValues(maps);
            }
        }
        return reportPage;
    }



    //计算固定的参数项
    @Override
    public void calcUsage(ReportDto item, List<ReportDto> reportDtos) {
        if (item == null || reportDtos.size()==0 ) {
            return;
        }
        // 固定参数项
        int index = -1;
        for (int i = 0; i < reportDtos.size(); i++) {
            if (reportDtos.get(i).getMonth().equals(item.getMonth())){
                index = i;
            }
        }
        if (index == -1) {
            return;
        }
        Double power = reportDtos!=null&&reportDtos.get(index)!=null?reportDtos.get(index).getPowerUsage():0;
        Double water = reportDtos!=null&&reportDtos.get(index)!=null?reportDtos.get(index).getIntakeWaterUsage():0;
        Double yieldWaterUsage = reportDtos!=null&&reportDtos.get(index)!=null? reportDtos.get(index).getYieldWaterUsage():0;
        if (item.getSceneTypeName() != null && "水源水厂".indexOf(item.getSceneTypeName()) != -1){
            item.setPowerUsage(doubleDivideValue(power));
            item.setIntakeWaterUsage(doubleDivideValue(water));
            item.setYieldWaterUsage(doubleDivideValue(yieldWaterUsage));
        } else {
            item.setPowerUsage(power);
            item.setIntakeWaterUsage(water);
            item.setYieldWaterUsage(yieldWaterUsage);
        }
        item.setDrugUsage(reportDtos!=null&&reportDtos.get(index)!=null?reportDtos.get(index).getDrugUsage():0);
    }



    public Page<DevicePressReportAttributeDto> findDevicePressPage(IPage<DevicePressReportAttributeDto> page, Long[] ids, Integer year, Integer month, Integer day,Integer type) {
        LoginUser currentUser = UserUtil.getCurrentUser();
        Page<DevicePressReportAttributeDto> reportPage = new Page<>();
        //查询场景下的所有设备信息
        List<DeviceDto> devices = new ArrayList<>();
        for (Long id : ids) {
            DeviceDto deviceDto = new DeviceDto();
            deviceDto.setId(id);
            devices.add(deviceDto);
        }
        if (devices.size() > 0) {
            //根据设备ID查询报表测点信息
            YearReportEntity yearReportEntity = new YearReportEntity();
            yearReportEntity.setYear(year);
            yearReportEntity.setTenantId(currentUser.getTenantId());
            yearReportEntity.setType(type);
            yearReportEntity.setDeviceIds(devices);
            //查询到分页的行数
            reportPage = yearReportMapper.findDevicePressPage(page, yearReportEntity);
        }
        return reportPage;
    }

    public Page<DeviceWaterReportAttributeDto> findDeviceWaterPage(IPage<DeviceWaterReportAttributeDto> page, Long[] ids, Integer year, Integer month, Integer day) {
        LoginUser currentUser = UserUtil.getCurrentUser();
        Page<DeviceWaterReportAttributeDto> reportPage = new Page<>();
        //查询场景下的所有设备信息
        List<DeviceDto> devices = new ArrayList<>();
        for (Long id : ids) {
            DeviceDto deviceDto = new DeviceDto();
            deviceDto.setId(id);
            devices.add(deviceDto);
        }
        if (devices.size() > 0) {
            //根据设备ID查询报表测点信息
            YearReportEntity yearReportEntity = new YearReportEntity();
            yearReportEntity.setYear(year);
            yearReportEntity.setTenantId(currentUser.getTenantId());
            yearReportEntity.setDeviceIds(devices);
            //查询到分页的行数
            reportPage = yearReportMapper.findDeviceWaterPage(page, yearReportEntity);
        }
        return reportPage;
    }
   public List<YearReportEntity> findAmountTotalBySceneIds(YearReportEntity yearReportEntity) {
       return yearReportMapper.findAmountTotalBySceneIds(yearReportEntity);
   }

    @Override
    List<ReportDto> findReport(ReportDto reportDto) {
        return yearReportMapper.findReport(reportDto);
    }

    @Override
    List<ReportAttributeDto> findAttributeList(ReportDto item) {
        return yearReportMapper.findAttributeList(item);
    }


    public Page<ReportDto> findDevicePressPageReport(IPage<ReportDto> page,  ReportQueryDto queryDto) {
        List<DeviceDto> devices = devicesToList(queryDto.getIds());
        if (devices.size() == 0 ){
            return new Page<>();
        }
        Page<ReportDto> reportPage = yearReportMapper.findPageReprot(page, getReportPageQuery(queryDto, devices, true));
        reportDataHandle(queryDto, devices, reportPage, true);
        return reportPage;
    }

    public Page<ReportDto> findPageReport(IPage<ReportDto> page, ReportQueryDto queryDto) {
        // 查询场景下的所有设备信息
        List<DeviceDto> devices = findDevices(queryDto.getIds());
        if (devices.size() == 0 ){
            return new Page<>();
        }
        Page<ReportDto> reportPage = yearReportMapper.findPageReprot(page, getReportPageQuery(queryDto, devices, false));
        reportDataHandle(queryDto, devices, reportPage, false);
        return reportPage;
    }

}
