package com.yida.data.common.core.utils;

import com.yida.data.common.core.entity.CurrentUser;
import com.yida.data.common.core.entity.constant.StringConstant;
import com.yida.data.common.core.entity.system.enums.RoleEnum;
import com.yida.data.common.core.exception.FebsException;
import lombok.AccessLevel;
import lombok.NoArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.util.CollectionUtils;

import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;

/**
 * 角色操作工具类
 *
 * @author ZYJ
 * @date 2021/11/12
 */
@Slf4j
@NoArgsConstructor(access = AccessLevel.PRIVATE)
public class RoleUtil {

    /**
     * 获取登陆用户角色类型集合
     *
     * @param currentUser 登陆用户数据
     * @return java.util.List<com.yida.data.common.core.entity.system.enums.RoleEnum>
     * @author ZYJ
     * @date 2021/11/12 14:00
     */
    public static List<RoleEnum> getRoleList(CurrentUser currentUser) {
        try {
            // 获取登陆用户角色类型
            List<RoleEnum> roleList = new ArrayList<>();
            if (StringUtils.isNotBlank(Objects.requireNonNull(currentUser).getRolePerms())) {
                for (String rolePerm : Objects.requireNonNull(currentUser).getRolePerms().split(StringConstant.COMMA)) {
                    // 获取登陆角色类型
                    RoleEnum roleEnum = EnumUtils.valueOf(RoleEnum.class, rolePerm,
                            RoleEnum.class.getMethod("getValue"));
                    if (Objects.nonNull(roleEnum)) {
                        roleList.add(roleEnum);
                    }
                }
            }
            return roleList;
        } catch (Exception e) {
            log.error("获取登陆角色数据失败", e);
            throw new FebsException("获取登陆角色数据失败");
        }
    }

    /**
     * 获取登陆用户的最大角色
     *
     * @param currentUser 登陆用户数据
     * @return com.yida.data.common.core.entity.system.enums.RoleEnum
     * @author ZYJ
     * @date 2021/11/12 14:01
     */
    public static RoleEnum getMaxRole(CurrentUser currentUser) {
        List<RoleEnum> roleList = getRoleList(currentUser);
        if (CollectionUtils.isEmpty(roleList)) {
            return null;
        }
        // 排序
        return roleList.stream().sorted(Comparator.comparing(RoleEnum::getOrder))
                .collect(Collectors.toList()).get(0);
    }

}
