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

import java.util.*;
import java.util.stream.Collectors;

import cn.iocoder.yudao.framework.common.pojo.PageParam;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
import cn.iocoder.yudao.module.iot.dal.dataobject.device.DeviceDO;
import cn.iocoder.yudao.module.iot.dal.dataobject.deviceattributetype.DeviceAttributeTypeDO;
import cn.iocoder.yudao.module.iot.dal.dataobject.devicemodelattribute.DeviceModelAttributeDO;
import com.alibaba.excel.util.StringUtils;
import org.apache.ibatis.annotations.Mapper;
import cn.iocoder.yudao.module.iot.controller.admin.devicemodelattribute.vo.*;

/**
 * 采集设备模型-点位管理 Mapper
 *
 * @author 内蒙必硕
 */
@Mapper
public interface DeviceModelAttributeMapper extends BaseMapperX<DeviceModelAttributeDO> {


    default PageResult<DeviceModelAttributeDO> selectPageById(PageParam reqVO, DeviceModelAttributePageReqVO device) {
        return selectPage(reqVO, new LambdaQueryWrapperX<DeviceModelAttributeDO>()
                // 使用StringUtils.hasText()进行更严格的字符串非空判断
                .like(StringUtils.isNotBlank(device.getAttributeCode()), DeviceModelAttributeDO::getAttributeCode, device.getAttributeCode())
                .like(StringUtils.isNotBlank(device.getAttributeName()), DeviceModelAttributeDO::getAttributeName, device.getAttributeName())
                // 对于枚举或数值类型，使用Objects.nonNull()判断
                .eq(Objects.nonNull(device.getAttributeType()), DeviceModelAttributeDO::getAttributeType, device.getAttributeType())
                // 必要的条件（如deviceModelId）保留直接eq条件
                .eq(DeviceModelAttributeDO::getDeviceModelId, device.getDeviceModelId())
                .orderByDesc(DeviceModelAttributeDO::getId));
    }


    default PageResult<DeviceModelAttributeDO> selectPage(DeviceModelAttributePageReqVO reqVO) {

        LambdaQueryWrapperX<DeviceModelAttributeDO> deviceModelAttributeDOLambdaQueryWrapperX = new LambdaQueryWrapperX<>();
        deviceModelAttributeDOLambdaQueryWrapperX.eqIfPresent(DeviceModelAttributeDO::getAttributeCode, reqVO.getAttributeCode())
                .likeIfPresent(DeviceModelAttributeDO::getAttributeName, reqVO.getAttributeName())
                .eqIfPresent(DeviceModelAttributeDO::getAttributeType, reqVO.getAttributeType())
                .eqIfPresent(DeviceModelAttributeDO::getDataType, reqVO.getDataType())
                .eqIfPresent(DeviceModelAttributeDO::getAddress, reqVO.getAddress())
                .eqIfPresent(DeviceModelAttributeDO::getDataUnit, reqVO.getDataUnit())
                .eqIfPresent(DeviceModelAttributeDO::getRatio, reqVO.getRatio())
                .eqIfPresent(DeviceModelAttributeDO::getRemark, reqVO.getRemark())
                .eqIfPresent(DeviceModelAttributeDO::getDeviceModelId, reqVO.getId())
                .betweenIfPresent(DeviceModelAttributeDO::getCreateTime, reqVO.getCreateTime())
                .orderByDesc(DeviceModelAttributeDO::getId);


        if(reqVO.getIds() !=null  && StringUtils.isNotBlank(reqVO.getIds())){
            List<Long> idList = Arrays.stream(reqVO.getIds().split(","))
                    .map(String::trim)
                    .map(Long::valueOf)
                    .collect(Collectors.toList());
            deviceModelAttributeDOLambdaQueryWrapperX.in(DeviceModelAttributeDO::getId,idList);
        }

        PageResult<DeviceModelAttributeDO> deviceModelAttributeDOPageResult = selectPage(reqVO, deviceModelAttributeDOLambdaQueryWrapperX);
        return deviceModelAttributeDOPageResult;

    }

    default DeviceModelAttributeDO selectByAttributeCode(String attributeCode) {
        return selectOne(DeviceModelAttributeDO::getAttributeCode, attributeCode);
    }

}