package com.zcxk.service;


import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.zcxk.dao.DayReportMapper;
import com.zcxk.dto.*;
import com.zcxk.entity.DayReportEntity;
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 DayReportService extends AbstractReportService<DayReportMapper, DayReportEntity>{

    @Resource
    private DayReportMapper dayReportMapper;

    /**
     * 查列表
     */
    public List<DayReportEntity> findList(DayReportEntity dayReportEntity) {
        return dayReportMapper.findList(dayReportEntity);
    }

    /**
     * 保存
     */
    public boolean addDayReport(DayReportEntity dayReport) {
        if (this.save(dayReport)) {
            return true;
        }
        return false;
    }


    /**
     * 根居ID获取对象
     */
    public DayReportEntity findDayReportById(Long id) {
        return dayReportMapper.findDayReportById(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) {
            //根据设备ID查询报表测点信息
            DayReportEntity dayReportEntity = new DayReportEntity();
            dayReportEntity.setYear(year);
            dayReportEntity.setMonth(month);
            dayReportEntity.setDay(day);
            dayReportEntity.setTenantId(currentUser.getTenantId());
            dayReportEntity.setParentSceneIds(ids);
            dayReportEntity.setDeviceIds(devices);
            //查询到分页的行数
            reportPage = dayReportMapper.findPage(page, dayReportEntity);
            //查询标题
            ReportDto reportDto = new ReportDto();
            reportDto.setYear(year);
            reportDto.setMonth(month);
            reportDto.setDay(day);
            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 = dayReportMapper.findReport(reportDto);
            //单个属性值
            for (ReportDto item : reportPage.getRecords()) {
                item.setCollectDate(item.getYear() + "-" + String.format("%02d", item.getMonth()) + "-" + String.format("%02d", item.getDay()) + " " + String.format("%02d", item.getHour()) + ":00");
                item.setDeviceIds(devices);
                item.setDataTitle(dataTitle);
                //固定参数项
                calcUsage(item, reportDtos);
                //动态参数项
                List<ReportAttributeDto> reportAttributeDtos = dayReportMapper.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).getHour().equals(item.getHour())) {
                index = i;
            }
        }
        if (index == -1) {
            return;
        }
        //System.out.println(reportDtos.get(-1));
        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);
//        if (index != -1) {
//            if ((index + 2) <= reportDtos.size()) {
//                item.setYieldWaterUsage(reportDtos.get(index).getYieldWaterUsage() - reportDtos.get(index + 1).getYieldWaterUsage());
//                item.setIntakeWaterUsage(reportDtos.get(index).getIntakeWaterUsage() - reportDtos.get(index + 1).getIntakeWaterUsage());
//                item.setPowerUsage(reportDtos.get(index).getPowerUsage() - reportDtos.get(index + 1).getPowerUsage());
//                item.setDrugUsage(reportDtos.get(index).getDrugUsage() - reportDtos.get(index + 1).getDrugUsage());
//            } else {
//                item.setYieldWaterUsage(0d);
//                item.setIntakeWaterUsage(0d);
//                item.setPowerUsage(0d);
//                item.setDrugUsage(0d);
//            }
//        }
    }



    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查询报表测点信息
            DayReportEntity dayReportEntity = new DayReportEntity();
            dayReportEntity.setYear(year);
            dayReportEntity.setMonth(month);
            dayReportEntity.setDay(day);
            dayReportEntity.setTenantId(currentUser.getTenantId());
            dayReportEntity.setType(type);
            dayReportEntity.setDeviceIds(devices);
            //查询到分页的行数
            reportPage = dayReportMapper.findDevicePressPage(page, dayReportEntity);
        }
        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查询报表测点信息
            DayReportEntity dayReportEntity = new DayReportEntity();
            dayReportEntity.setYear(year);
            dayReportEntity.setMonth(month);
            dayReportEntity.setDay(day);
            dayReportEntity.setTenantId(currentUser.getTenantId());
            dayReportEntity.setDeviceIds(devices);
            //查询到分页的行数
            reportPage = dayReportMapper.findDeviceWaterPage(page, dayReportEntity, currentUser.getId());
        }
        return reportPage;
    }
    List<DayReportEntity> findDeviceLastDayValue(DayReportEntity dayReportEntity) {
        return dayReportMapper.findDeviceLastDayValue(dayReportEntity);
    }


    /**
     * 查询报表数据
     * 根据自定义报表参数，是否查找自定义值
     * @param page
     * @param queryDto
     * @return
     */
    public Page<ReportDto> findPageReport(IPage<ReportDto> page, ReportQueryDto queryDto) {
        Page<ReportDto> reportPage = new Page<>();
        // 查询场景下的所有设备信息
        List<DeviceDto> devices = findDevices(queryDto.getIds());
        if (devices.size() == 0 ){
            return reportPage;
        }
        // 根据设备ID查询报表测点信息,查询到分页的行数
        reportPage = dayReportMapper.findPageReprot(page, getReportPageQuery(queryDto, devices,false));
        reportDataHandle(queryDto, devices, reportPage, false);
        return reportPage;
    }

    public Page<ReportDto> findDevicePressPageReport(IPage<ReportDto> page,  ReportQueryDto queryDto) {
        Page<ReportDto> reportPage = new Page<>();
        List<DeviceDto> devices = devicesToList(queryDto.getIds());
        if (devices.size() == 0 ){
            return reportPage;
        }
        // 根据设备ID查询报表测点信息,查询到分页的行数
        reportPage = dayReportMapper.findPageReprot(page, getReportPageQuery(queryDto, devices, true));
        reportDataHandle(queryDto, devices, reportPage, true);
        //查询到分页的行数
        return reportPage;
    }


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

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