package cn.ey.biz.module.system.dal.mapper.category;

import cn.ey.biz.framework.mybatis.core.mapper.BaseMapperX;
import cn.ey.biz.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.ey.biz.module.system.api.category.dto.CategoryDataV2ReqDTO;
import cn.ey.biz.module.system.api.category.dto.CategoryDataV2RespDTO;
import cn.ey.biz.module.system.controller.admin.category.vo.*;
import cn.ey.biz.module.system.controller.admin.i18n.vo.I18nRespVO;
import cn.ey.biz.module.system.dal.dataobject.category.CategoryDataDO;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;

import java.util.List;

/**
 * 字典分类数据 Mapper
 *
 */
@Mapper
public interface CategoryDataMapper extends BaseMapperX<CategoryDataDO> {

    default CategoryDataDO selectByParentIdAndName(Long pid, String name) {
        return selectOne(new LambdaQueryWrapper<CategoryDataDO>().eq(CategoryDataDO::getPid, pid)
                .eq(CategoryDataDO::getName, name));
    }
    default List<CategoryDataDO> selectList(CategoryDataExportReqVO reqVO) {
        return selectList(new LambdaQueryWrapperX<CategoryDataDO>()
                .eqIfPresent(CategoryDataDO::getPid, reqVO.getPid())
                .eqIfPresent(CategoryDataDO::getCategoryCode, reqVO.getCategoryCode())
                .eqIfPresent(CategoryDataDO::getCode, reqVO.getCode())
                .likeIfPresent(CategoryDataDO::getName, reqVO.getName())
                .eqIfPresent(CategoryDataDO::getValue, reqVO.getValue())
                .eqIfPresent(CategoryDataDO::getHasChildren, reqVO.getHasChildren())
                .eqIfPresent(CategoryDataDO::getStatus, reqVO.getStatus())
                .eqIfPresent(CategoryDataDO::getRemark, reqVO.getRemark())
                .betweenIfPresent(CategoryDataDO::getCreateTime, reqVO.getCreateTime())
                .orderByDesc(CategoryDataDO::getId));
    }

    default Long selectCountByParentId(Long parentId) {
        return selectCount(CategoryDataDO::getPid, parentId);
    }

    default CategoryDataDO selectParentDictionaryByParentId(Long parentId) {
        return selectOne(CategoryDataDO::getId, parentId);
    }

    default List<CategoryDataDO> getCategoryByidData(Long parentId) {
        return selectList(CategoryDataDO::getPid, parentId);
    }

    default CategoryDataDO getcategoryByCodeAndName(String code, String name) {
        return selectOne(new LambdaQueryWrapper<CategoryDataDO>().eq(CategoryDataDO::getCategoryCode, code)
                .eq(CategoryDataDO::getName, name));
    }


    default List<CategoryDataDO> selectByCode(String code) {
        return selectList(new LambdaQueryWrapper<CategoryDataDO>().eq(CategoryDataDO::getCode, code));
    }

    List<CategoryDataSimpleRespVO> selectLists(@Param("app") String app, @Param("acceptLanguage") String acceptLanguage);

    IPage<CategoryDataRespVO> selectPage(IPage page, @Param("c") CategoryDataPageReqVO pageReqVO);

    CategoryDataRespVO checkNameRepetition(@Param("c") CategoryDataBaseVO reqVo, @Param("i") I18nRespVO lang, @Param("id") Long id);

    CategoryDataDO getCategoryDataKey(@Param("app") String app, @Param("category") String category, @Param("key") String key);

    // V2

    /**
     * 按查询条件获取最新版本的字典分类数据
     *
     * @param req 查询参数
     * @return List<CategoryDataV2RespDTO>
     */
    List<CategoryDataV2RespDTO> getCategoryDataV2(@Param("req") CategoryDataV2ReqDTO req);

    /**
     * 获取应用管理的字典分类数据与语言标签
     *
     * @param app            应用编码
     * @param acceptLanguage 语言
     * @param status         0 -正常  1-停用  all-全部
     * @return 最新字典分类数据
     */
    List<CategoryDataSimpleRespVO> selectListsV2(@Param("app") String app, @Param("acceptLanguage") String acceptLanguage,
                                                 @Param("status") Integer status);

}
