package cn.iocoder.yudao.module.pms.dal.mysql.iotmodeltemplateattrs;

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.framework.tenant.core.aop.TenantIgnore;
import cn.iocoder.yudao.module.pms.controller.admin.iotmodeltemplateattrs.vo.IotModelTemplateAttrsPageReqVO;
import cn.iocoder.yudao.module.pms.dal.dataobject.iotmodeltemplateattrs.IotModelTemplateAttrsDO;
import cn.iocoder.yudao.module.pms.dal.dataobject.iotmodeltemplateattrs.IotThingsModelDO;
import com.baomidou.dynamic.datasource.annotation.DS;
import org.apache.ibatis.annotations.Mapper;

import java.util.List;

/**
 * PMS 功能优化 设备模板属性 Mapper
 *
 * @author 芋道源码
 */
@Mapper
public interface IotModelTemplateAttrsMapper extends BaseMapperX<IotModelTemplateAttrsDO> {

    default PageResult<IotModelTemplateAttrsDO> selectPage(IotModelTemplateAttrsPageReqVO reqVO) {
        return selectPage(reqVO, new LambdaQueryWrapperX<IotModelTemplateAttrsDO>()
                .eqIfPresent(IotModelTemplateAttrsDO::getDeviceCategoryId, reqVO.getDeviceCategoryId())
                .eqIfPresent(IotModelTemplateAttrsDO::getDeviceId, reqVO.getDeviceId())
                .eqIfPresent(IotModelTemplateAttrsDO::getTemplateId, reqVO.getTemplateId())
                .likeIfPresent(IotModelTemplateAttrsDO::getName, reqVO.getName())
                .eqIfPresent(IotModelTemplateAttrsDO::getCode, reqVO.getCode())
                .eqIfPresent(IotModelTemplateAttrsDO::getType, reqVO.getType())
                .eqIfPresent(IotModelTemplateAttrsDO::getRequiredFlag, reqVO.getRequiredFlag())
                .eqIfPresent(IotModelTemplateAttrsDO::getDefaultValue, reqVO.getDefaultValue())
                .eqIfPresent(IotModelTemplateAttrsDO::getUnit, reqVO.getUnit())
                .eqIfPresent(IotModelTemplateAttrsDO::getDescription, reqVO.getDescription())
                .eqIfPresent(IotModelTemplateAttrsDO::getStatus, reqVO.getStatus())
                .eqIfPresent(IotModelTemplateAttrsDO::getModelAttr, reqVO.getModelAttr())
                .eqIfPresent(IotModelTemplateAttrsDO::getIsCollection, reqVO.getIsCollection())
                .eqIfPresent(IotModelTemplateAttrsDO::getIsSum, reqVO.getIsSum())
                .eqIfPresent(IotModelTemplateAttrsDO::getRemark, reqVO.getRemark())
                .eqIfPresent(IotModelTemplateAttrsDO::getSort, reqVO.getSort())
                .eqIfPresent(IotModelTemplateAttrsDO::getSelectOptions, reqVO.getSelectOptions())
                .eqIfPresent(IotModelTemplateAttrsDO::getVersion, reqVO.getVersion())
                .betweenIfPresent(IotModelTemplateAttrsDO::getCreateTime, reqVO.getCreateTime())
                .orderByDesc(IotModelTemplateAttrsDO::getId));
    }

    default List<IotModelTemplateAttrsDO> selectList(IotModelTemplateAttrsPageReqVO reqVO) {
        LambdaQueryWrapperX<IotModelTemplateAttrsDO> queryWrapper = new LambdaQueryWrapperX<>();

        // 添加基础查询条件
        queryWrapper
                .eqIfPresent(IotModelTemplateAttrsDO::getDeviceCategoryId, reqVO.getDeviceCategoryId())
                .inIfPresent(IotModelTemplateAttrsDO::getDeviceCategoryId, reqVO.getDeviceCategoryIds())
                .eqIfPresent(IotModelTemplateAttrsDO::getDeviceId, reqVO.getDeviceId())
                .eqIfPresent(IotModelTemplateAttrsDO::getTemplateId, reqVO.getTemplateId())
                .likeIfPresent(IotModelTemplateAttrsDO::getName, reqVO.getName())
                .eqIfPresent(IotModelTemplateAttrsDO::getType, reqVO.getType())
                .eqIfPresent(IotModelTemplateAttrsDO::getRequiredFlag, reqVO.getRequiredFlag())
                .eqIfPresent(IotModelTemplateAttrsDO::getDefaultValue, reqVO.getDefaultValue())
                .eqIfPresent(IotModelTemplateAttrsDO::getUnit, reqVO.getUnit())
                .eqIfPresent(IotModelTemplateAttrsDO::getDescription, reqVO.getDescription())
                .eqIfPresent(IotModelTemplateAttrsDO::getStatus, reqVO.getStatus())
                .eqIfPresent(IotModelTemplateAttrsDO::getModelAttr, reqVO.getModelAttr())
                .eqIfPresent(IotModelTemplateAttrsDO::getIsCollection, reqVO.getIsCollection())
                .eqIfPresent(IotModelTemplateAttrsDO::getIsSum, reqVO.getIsSum())
                .eqIfPresent(IotModelTemplateAttrsDO::getRemark, reqVO.getRemark())
                .eqIfPresent(IotModelTemplateAttrsDO::getSort, reqVO.getSort())
                .eqIfPresent(IotModelTemplateAttrsDO::getSelectOptions, reqVO.getSelectOptions())
                .eqIfPresent(IotModelTemplateAttrsDO::getVersion, reqVO.getVersion())
                .betweenIfPresent(IotModelTemplateAttrsDO::getCreateTime, reqVO.getCreateTime());

        // 处理 multipleFlag 和 code 的特殊逻辑
        if ("Y".equals(reqVO.getMultipleFlag())) {
            // 查询 code 为 NULL 或 '' 的记录
            queryWrapper.and(wrapper -> wrapper.isNull(IotModelTemplateAttrsDO::getCode).or().eq(IotModelTemplateAttrsDO::getCode, ""));
        } else {
            // 正常查询 code 条件
            queryWrapper.eqIfPresent(IotModelTemplateAttrsDO::getCode, reqVO.getCode())
                    .inIfPresent(IotModelTemplateAttrsDO::getCode, reqVO.getCodes());
        }

        return selectList(queryWrapper);
    }

    @DS("yanfan")
    @TenantIgnore
    List<IotThingsModelDO> getAttrsByName(String name);

    @TenantIgnore
    List<IotModelTemplateAttrsDO> getAttrsByDeviceId(Long id);

}