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.SysRoleMapper;
import com.jy.system.model.dto.SysRoleSelectDto;
import com.jy.system.model.entity.SysRole;
import com.jy.system.model.table.SysRoleTable;
import com.jy.system.model.table.SysUserRoleTable;
import com.jy.system.model.vo.SysRoleVo;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class SysRoleDao extends BaseDao<SysRoleMapper, SysRole> {

    /**
     * 角色列表
     */
    public List<SysRoleVo> getList(SysRoleSelectDto dto) {
        SysRoleTable sr = SysRoleTable.sr;

        return sql(SysRoleVo.class)
                .select(
                        sr.id,
                        sr.name,
                        sr.code
                )
                .from(sr)
                .where(
                        sr.status.eq(dto.getStatus())
                )
                .orderBy(
                        sr.builtin.desc(),
                        sr.sort.asc(),
                        sr.id.desc()
                )
                .list();
    }

    /**
     * 角色分页
     */
    public Page<SysRoleVo> getPage(SysRoleSelectDto dto) {
        SysRoleTable sr = SysRoleTable.sr;

        return sql(SysRoleVo.class)
                .select(
                        sr.id,
                        sr.name,
                        sr.code,
                        sr.builtin,
                        sr.status,
                        sr.sort,
                        sr.remark
                )
                .from(sr)
                .where(
                        sr.builtin.eq(dto.getBuiltin()),
                        sr.status.eq(dto.getStatus()),
                        sr.name.like(dto.getName()),
                        sr.code.like(dto.getCode())
                )
                .orderBy(
                        sr.builtin.desc(),
                        sr.sort.asc(),
                        sr.id.desc()
                )
                .page(dto.getPage());
    }

    /**
     * 角色明细
     */
    public SysRoleVo getDetail(Long id) {
        SysRoleTable sr = SysRoleTable.sr;

        return sql(SysRoleVo.class)
                .select(
                        sr.id,
                        sr.name,
                        sr.code,
                        sr.builtin,
                        sr.status,
                        sr.sort,
                        sr.remark
                )
                .from(sr)
                .where(sr.id.eq(id))
                .one();
    }

    /**
     * 角色编码是否存在
     */
    public boolean codeExists(String code) {
        return lambdaQuery().eq(SysRole::getCode, code).exists();
    }

    /**
     * 角色名称是否存在
     */
    public boolean nameExists(String name) {
        return lambdaQuery().eq(SysRole::getName, name).exists();
    }

    /**
     * 角色名称是否存在（排除id）
     */
    public boolean nameExists(String name, Long exclusionId) {
        return lambdaQuery().eq(SysRole::getName, name).ne(BaseIdPo::getId, exclusionId).exists();
    }

    /**
     * 获取用户拥有的启用角色列表
     */
    public List<SysRole> getUserEnableList(Long userId) {
        SysRoleTable sr = SysRoleTable.sr;
        SysUserRoleTable sur = SysUserRoleTable.sur;

        return sql(SysRole.class)
                .select(
                        sr.id,
                        sr.code,
                        sr.dataScope
                )
                .from(sur)
                .innerJoin(sr).on(sur.roleId.eq(sr.id))
                .where(
                        sur.userId.eq(userId),
                        sr.status.eq(CommonConstant.ENABLE)
                )
                .list();
    }

}
