package cn.iocoder.yudao.module.iot.dal.mysql.mqttdatarecord;

import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.module.iot.controller.admin.mqttdatarecord.vo.MqttDataRecordPageReqVO;
import cn.iocoder.yudao.module.iot.dal.dataobject.mqttdatarecord.MqttDataRecordDO;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import org.apache.commons.lang3.StringUtils;
import org.apache.ibatis.annotations.Mapper;

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

/**
 * 设备数据记录 Mapper
 *
 * @author 内蒙必硕
 */
@Mapper
public interface MqttDataRecordMapper extends BaseMapperX<MqttDataRecordDO> {

    default PageResult<MqttDataRecordDO> selectPage(MqttDataRecordPageReqVO reqVO) {
        return selectPage(reqVO, new LambdaQueryWrapperX<MqttDataRecordDO>()
                .eqIfPresent(MqttDataRecordDO::getDeviceName, reqVO.getDeviceName())
                .eqIfPresent(MqttDataRecordDO::getAttribute, reqVO.getAttribute())
                .eqIfPresent(MqttDataRecordDO::getAttrValue, reqVO.getAttrValue())
                .betweenIfPresent(MqttDataRecordDO::getDeviceTime, reqVO.getDeviceTime())
                .betweenIfPresent(MqttDataRecordDO::getCreateTime, reqVO.getCreateTime())
                .orderByDesc(MqttDataRecordDO::getId));
    }

    default List<MqttDataRecordDO> select(MqttDataRecordPageReqVO reqVO) {
        return selectList(new LambdaQueryWrapperX<MqttDataRecordDO>()
                .eqIfPresent(MqttDataRecordDO::getDeviceName, reqVO.getDeviceName())
                .eqIfPresent(MqttDataRecordDO::getAttribute, reqVO.getAttribute())
                .eqIfPresent(MqttDataRecordDO::getAttrValue, reqVO.getAttrValue())
                .betweenIfPresent(MqttDataRecordDO::getDeviceTime, reqVO.getDeviceTime())
                .betweenIfPresent(MqttDataRecordDO::getCreateTime, reqVO.getCreateTime())
                .orderByDesc(MqttDataRecordDO::getId)
                .last("limit "+reqVO.getPageSize()));
    }
    default MqttDataRecordDO selectLastOne(MqttDataRecordPageReqVO reqVO) {
        return selectOne(new QueryWrapper<MqttDataRecordDO>()
                .eq(StringUtils.isNotBlank(reqVO.getDeviceName()),"device_name", reqVO.getDeviceName())
                .eq(StringUtils.isNotBlank(reqVO.getAttribute()),"attribute", reqVO.getAttribute())
                .orderByDesc("id")
                .last("limit 1"));
    }

    default BigDecimal selectSum(MqttDataRecordPageReqVO reqVO) {
        List<MqttDataRecordDO> list =  select(reqVO);
        BigDecimal sum = BigDecimal.ZERO;
        if(list!=null && list.size()>0) {
            for (MqttDataRecordDO recordDO: list) {
                if(StringUtils.isNotBlank(recordDO.getAttrValue())){
                    try {
                        double d = Double.parseDouble(recordDO.getAttrValue());
                        sum = sum.add(BigDecimal.valueOf(d));
                    }catch (NumberFormatException e){
                        System.out.println("------error: default BigDecimal selectSum():采集数据不是数字！------");
                    }
                }
            }
        }
        return sum;
    }

    default PageResult<MqttDataRecordDO> selectPage2(MqttDataRecordPageReqVO reqVO) {
        return selectPage(reqVO, new LambdaQueryWrapperX<MqttDataRecordDO>()
                .eqIfPresent(MqttDataRecordDO::getDeviceName, reqVO.getDeviceName())
                .inIfPresent(MqttDataRecordDO::getAttribute, reqVO.getAttributes())
                .eqIfPresent(MqttDataRecordDO::getAttrValue, reqVO.getAttrValue())
                .betweenIfPresent(MqttDataRecordDO::getDeviceTime, reqVO.getDeviceTime())
                .betweenIfPresent(MqttDataRecordDO::getCreateTime, reqVO.getCreateTime())
                .orderByDesc(MqttDataRecordDO::getId));
    }
}