package com.yiboshi.science.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.yiboshi.science.base.BaseServiceImpl;
import com.yiboshi.science.base.Pagination;
import com.yiboshi.science.dao.SystemRoleDAO;
import com.yiboshi.science.entity.SystemRole;
import com.yiboshi.science.param.dto.SystemRoleDTO;
import com.yiboshi.science.param.query.SystemRoleQueryVO;
import com.yiboshi.science.service.SystemRoleService;
import com.yiboshi.science.utils.RedisKey;
import com.yiboshi.science.utils.RedisUtils;
import lombok.AllArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.Objects;
import java.util.concurrent.TimeUnit;

/**
 * 系统角色表 Service 实现类
 *
 * @author lkl
 * @version 2021-08-26
 */
@Service
@AllArgsConstructor
public class SystemRoleServiceImpl extends BaseServiceImpl<SystemRoleDAO, SystemRoleQueryVO, SystemRoleDTO, SystemRole> implements SystemRoleService {
    @Autowired
    private SystemRoleDAO systemRoleDAO;

    private final RedisUtils redisUtils;

    @Override
    protected void setCriteriaForQuery(SystemRoleQueryVO vo, QueryWrapper<SystemRoleQueryVO> criteria) {
        if (Objects.nonNull(vo.getName())) {
            criteria.eq("name", vo.getName());
        }
    }

    @Override
    public Pagination<SystemRoleDTO> getListByPage(SystemRoleQueryVO vo) {
        QueryWrapper criteria = new QueryWrapper();
        setCriteriaForQuery(vo, criteria);
        Page<SystemRoleQueryVO> page = new Page<>(vo.getPageIndex(), vo.getPageSize());
        List<SystemRoleDTO> dtoList = systemRoleDAO.getListByPage(page, criteria).getRecords();
        return new Pagination<>(dtoList, page.getTotal(), vo.getPageSize());
    }

    public SystemRoleDTO getRoleById(String id) {
        return this.dtoById(id);
    }

    public String updateRole(SystemRole entity) {
        this.update(entity);
        return this.update(entity);
    }

    public String insertRole(SystemRole entity) {
        Integer roleId = getMaxRoleId();
        entity.setRoleId(roleId == null ? 1 : roleId + 1);
        this.insert(entity);
        return this.insert(entity);
    }

    public Integer getMaxRoleId() {
        return systemRoleDAO.getMaxRoleId();
    }

    public List<SystemRole> getRoleList() {
        return this.entityAll();
    }

    public String getAuthorityByRoleId(String roleId) {
        String authority = "";
        String[] arr = roleId.split(",");
        for (int i = 0; i < arr.length; i++) {
            for (SystemRole role : this.entityAll()) {
                if (role.getRoleId().toString().equals(arr[i])) {
                    authority += "," + role.getAuthority();
                    break;
                }
            }
        }
        if (!authority.equals(""))
            authority = authority.substring(1);
        return authority;
    }

    /**
     * 获取所有参数
     *
     * @return
     */
    public List<SystemRole> getList() {
        List<SystemRole> list = null;
        Object obj = redisUtils.get(RedisKey.RoleList);
        if (null != obj)
            list = (List<SystemRole>) redisUtils.get(RedisKey.RoleList);
        else {
            list = this.entityAll();
            redisUtils.set(RedisKey.RoleList, list, 7, TimeUnit.DAYS);
        }
        return list;
    }

}