package com.ho.business.service.impl;

import com.ho.business.feignclient.TdFeignClient;
import com.ho.business.mapper.AutoDeviceCurveMapper;
import com.ho.business.service.AutoDeviceCurveService;
import com.ho.common.tools.exception.DataResult;
import com.ho.common.tools.vo.req.StationHomeRespVo;
import com.ho.td.api.entity.query.TdBaseTimeQuery;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;

/**
 * @author catkins
 * @date 2023年10月23日 15:40
 */
@Service
@Slf4j
public class AutoDeviceCurveServiceImpl implements AutoDeviceCurveService {

    @Autowired
    private AutoDeviceCurveMapper autoDeviceCurveMapper;

    @Autowired
    private TdFeignClient tdFeignClient;

    @Override
    public Integer getSrcIdByStationId(Integer stationId, String deviceType) {
        return autoDeviceCurveMapper.getSrcIdByStationId(stationId, deviceType);
    }

    @Override
    public List<StationHomeRespVo> queryData(TdBaseTimeQuery query) {
        DataResult<List<StationHomeRespVo>> listDataResult = tdFeignClient.queryPointDataList(query);
        return listDataResult.getData();
    }

    /**
     * 获取曲线方法,方法内来分别调用下面计算的具体方法
     * @param vo1   最大/高曲线
     * @param vo2   最小/低曲线
     * @return
     */
    @Override
    public List<StationHomeRespVo> getCurve(List<StationHomeRespVo> vo1, List<StationHomeRespVo> vo2,List<String> min) {
        List<StationHomeRespVo> result = null;
        /*
        如果vo2结果集不为空,那么则表示查询的是两个曲线,需要根据两个曲线进行计算差值
        曲线内如果出现空值则不计算
        */
        if( vo2 != null && vo2.size() > 0 ){
            result = getDiffDatas(vo1,vo2,min);
        } else {
            result = getOneDatas(vo1,min);
        }
        return result;
    }

    /**
     * 对两条曲线进行差值计算,需要取绝对值
     * @param vo1 第一条曲线
     * @param vo2 第二条曲线
     * @return
     */
    private List<StationHomeRespVo> getDiffDatas(List<StationHomeRespVo> vo1, List<StationHomeRespVo> vo2,List<String> min) {
        List<StationHomeRespVo> result = null;
        // 先判断两个集合的大小是否相同,循环主体取长的那个
        int size_1 = vo1.size();
        int size_2 = vo2.size();
        if( size_2 > size_1 ){
            //第二个集合长
            result = diffData(vo2,vo1,min);
        } else {
            // 两个相等 或 第一个长
            result = diffData(vo1,vo2,min);
        }
        return result;
    }

    /**
     * 实际计算两个集合相减的方法
     * @param vo1 长的那个集合
     * @param vo2 短的那个集合
     * @return
     */
    private List<StationHomeRespVo> diffData(List<StationHomeRespVo> vo1, List<StationHomeRespVo> vo2,List<String> min){
        List<StationHomeRespVo> result = new ArrayList<>(0);
        StationHomeRespVo vo = null;
        for (StationHomeRespVo v1 : vo1) {
            vo = new StationHomeRespVo();
            for (StationHomeRespVo v2 : vo2) {
                if( v1.getDate().equals(v2.getDate()) ){
                    BigDecimal subtract = v1.getDigital().subtract(v2.getDigital());
                    vo.setDate(v1.getDate());
                    vo.setDigital(subtract.abs());
                    result.add(vo);
                    break;
                }
            }
        }
        return processCurve(result,min);
    }


    /**
     * 处理返回结果,补全时间
     * @param vos
     * @return
     */
    private List<StationHomeRespVo> processCurve(List<StationHomeRespVo> vos,List<String> min){
        //if( vos == null || vos.size() == 0 ){
        //    return null;
        //}
        List<StationHomeRespVo> result = new ArrayList<>(0);
        StationHomeRespVo vo = null;
        int index = 0;
        for (String date : min) {
            vo = new StationHomeRespVo();
            vo.setDate(date);
            vo.setDigital(BigDecimal.ZERO);
            for (int i = index; i < vos.size(); i++) {
                String voDate = vos.get(i).getDate().substring(0,16);
                if( voDate.equals(date) ){
                    index = i;
                    vo.setDate(date);
                    vo.setDigital(vos.get(i).getDigital());
                    break;
                }
            }
            result.add(vo);
        }
        return result;
    }

    /**
     * 直接获取一条曲线,不做任何处理
     * @param vo
     * @return
     */
    private List<StationHomeRespVo> getOneDatas(List<StationHomeRespVo> vo,List<String> min) {
        // todo: 对查询到的曲线进行数据整理,把没有数据的时间短也补全出来
        return processCurve(vo,min);
    }

    @Override
    public BigDecimal getOneValue(List<StationHomeRespVo> vo) {
        // 寻找结果集内最大值和最小值进行差值计算
        BigDecimal maxData = BigDecimal.ZERO;
        BigDecimal minData = BigDecimal.ZERO;
        for (StationHomeRespVo stationHomeRespVo : vo) {
            BigDecimal digital = stationHomeRespVo.getDigital();
            // todo: 首次进来先给两个变量赋默认值
            if( maxData.compareTo(BigDecimal.ZERO) == 0 && minData.compareTo(BigDecimal.ZERO) == 0 ){
                maxData = digital;
                minData = digital;
            }
            // todo: 取最大值
            if( maxData.compareTo(digital) < 0 ){
                maxData = digital;
            }
            // todo: 取最小值
            if( minData.compareTo(digital) > 0 ){
                minData = digital;
            }
        }
        return maxData.subtract(minData);
    }




}
