package com.jy.system.dao;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.jy.framework.model.base.BaseDao;
import com.jy.framework.model.base.BaseIdPo;
import com.jy.framework.model.constants.CommonConstant;
import com.jy.system.mapper.SysDictDataMapper;
import com.jy.system.model.dto.SysDictDataSelectDto;
import com.jy.system.model.entity.SysDictData;
import com.jy.system.model.table.SysDictDataTable;
import com.jy.system.model.table.SysDictTypeTable;
import com.jy.system.model.vo.SysDictDataCacheVo;
import com.jy.system.model.vo.SysDictDataVo;
import org.springframework.stereotype.Service;

import java.util.Collection;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;

@Service
public class SysDictDataDao extends BaseDao<SysDictDataMapper, SysDictData> {

    /**
     * 字典数据分页
     */
    public Page<SysDictDataVo> getPage(SysDictDataSelectDto dto) {
        SysDictDataTable sdd = SysDictDataTable.sdd;

        return sql(SysDictDataVo.class)
                .select(
                        sdd.id,
                        sdd.label,
                        sdd.value,
                        sdd.cssStyle,
                        sdd.status,
                        sdd.sort
                )
                .from(sdd)
                .where(
                        sdd.dictTypeId.eq(dto.getDictTypeId()),
                        sdd.status.eq(dto.getStatus()),
                        sdd.label.like(dto.getLabel()),
                        sdd.value.like(dto.getValue())
                )
                .orderBy(
                        sdd.sort.asc(),
                        sdd.id.desc()
                )
                .page(dto.getPage());
    }

    /**
     * 字典数据明细
     */
    public SysDictDataVo getDetail(Long id) {
        SysDictDataTable sdd = SysDictDataTable.sdd;

        return sql(SysDictDataVo.class)
                .select(
                        sdd.id,
                        sdd.label,
                        sdd.value,
                        sdd.cssStyle,
                        sdd.status,
                        sdd.sort
                )
                .from(sdd)
                .where(sdd.id.eq(id))
                .one();
    }

    /**
     * 字典标签是否存在
     */
    public boolean labelExists(Long dictTypeId, String label) {
        return lambdaQuery().eq(SysDictData::getDictTypeId, dictTypeId).eq(SysDictData::getLabel, label).exists();
    }

    /**
     * 字典标签是否存在（排除id）
     */
    public boolean labelExists(Long dictTypeId, String label, Long exclusionId) {
        return lambdaQuery().eq(SysDictData::getDictTypeId, dictTypeId).eq(SysDictData::getLabel, label)
                .ne(BaseIdPo::getId, exclusionId).exists();
    }

    /**
     * 字典值是否存在
     */
    public boolean valueExists(Long dictTypeId, Integer value) {
        return lambdaQuery().eq(SysDictData::getDictTypeId, dictTypeId).eq(SysDictData::getValue, value).exists();
    }

    /**
     * 字典值是否存在（排除id）
     */
    public boolean valueExists(Long dictTypeId, Integer value, Long exclusionId) {
        return lambdaQuery().eq(SysDictData::getDictTypeId, dictTypeId).eq(SysDictData::getValue, value)
                .ne(BaseIdPo::getId, exclusionId).exists();
    }

    /**
     * 根据id列表获取字典id集合
     */
    public Set<Long> getDictTypeIdSetByIdList(Collection<Long> ids) {
        return listByIds(ids).stream().map(SysDictData::getDictTypeId).collect(Collectors.toSet());
    }

    /**
     * 根据字典编码获取字典数据缓存列表
     */
    public List<SysDictDataCacheVo> getDictDataCacheVoListByCode(String code) {
        SysDictDataTable sdd = SysDictDataTable.sdd;
        SysDictTypeTable sdt = SysDictTypeTable.sdt;

        return sql(SysDictDataCacheVo.class)
                .select(
                        sdd.label,
                        sdd.value,
                        sdd.cssStyle
                )
                .from(sdt)
                .innerJoin(sdd).on(sdt.id.eq(sdd.dictTypeId))
                .where(
                        sdt.code.eq(code),
                        sdd.status.eq(CommonConstant.ENABLE)
                )
                .orderBy(
                        sdd.sort.asc(),
                        sdd.id.desc()
                )
                .list();
    }

}
