package cn.iocoder.byzs.module.bjdx.dal.mysql.coursetype;

import java.util.*;

import cn.iocoder.byzs.module.bjdx.controller.admin.coursetype.vo.CourseTypeListReqVO;
import cn.iocoder.byzs.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.byzs.framework.mybatis.core.mapper.BaseMapperX;
import cn.iocoder.byzs.module.bjdx.dal.dataobject.coursetype.CourseTypeDO;
import org.apache.ibatis.annotations.Mapper;
import cn.iocoder.byzs.module.bjdx.controller.admin.coursetype.vo.*;

/**
 * 课程-类型 Mapper
 *
 * @author lyb
 */
@Mapper
public interface CourseTypeMapper extends BaseMapperX<CourseTypeDO> {

    default List<CourseTypeDO> selectList(CourseTypeListReqVO reqVO) {
        LambdaQueryWrapperX<CourseTypeDO> queryWrapper = getCourseTypeDOLambdaQueryWrapperX(reqVO);

        // 使用BaseMapperX的selectList方法执行查询
        return selectList(queryWrapper);
    }

    default List<CourseTypeDO> selectSimpleList(CourseTypeListReqVO reqVO) {
        LambdaQueryWrapperX<CourseTypeDO> queryWrapper = getCourseTypeDOLambdaQueryWrapperX(reqVO);

        // 使用BaseMapperX的selectList方法执行查询
        return selectList(queryWrapper.select(CourseTypeDO::getId, CourseTypeDO::getCtParentId, CourseTypeDO::getCtType, CourseTypeDO::getCtTypeNode, CourseTypeDO::getCtTypeSort));
    }

    private static LambdaQueryWrapperX<CourseTypeDO> getCourseTypeDOLambdaQueryWrapperX(CourseTypeListReqVO reqVO) {
        LambdaQueryWrapperX<CourseTypeDO> queryWrapper = new LambdaQueryWrapperX<CourseTypeDO>()
                .eqIfPresent(CourseTypeDO::getCtParentId, reqVO.getCtParentId())
                .likeIfPresent(CourseTypeDO::getCtType, reqVO.getCtType());

        // 处理getCtTypeNode的特殊条件：不为空且不等于0时，同时查询该值和0
        Object ctTypeNode = reqVO.getCtTypeNode();
        if (ctTypeNode != null && !ctTypeNode.toString().equals("0")) {
            queryWrapper.and(wrapper -> wrapper
                    .eq(CourseTypeDO::getCtTypeNode, ctTypeNode)
                    .or()
                    .eq(CourseTypeDO::getCtTypeNode, 0)
                    .or()
                    .eq(CourseTypeDO::getCtTypeNode, -1)
            );
        } else {
            // 保持原有的eqIfPresent行为
            queryWrapper.eqIfPresent(CourseTypeDO::getCtTypeNode, ctTypeNode);
        }

        // 完成构建queryWrapper并添加剩余条件
        queryWrapper
                .likeIfPresent(CourseTypeDO::getCtTypeDescribe, reqVO.getCtTypeDescribe())
                .orderByAsc(CourseTypeDO::getCtTypeNode, CourseTypeDO::getCtTypeSort);
        return queryWrapper;
    }

	default CourseTypeDO selectByCtParentIdAndCtType(Long ctParentId, String ctType) {
	    return selectOne(CourseTypeDO::getCtParentId, ctParentId, CourseTypeDO::getCtType, ctType);
	}

    default Long selectCountByCtParentId(Long ctParentId) {
        return selectCount(CourseTypeDO::getCtParentId, ctParentId);
    }

}