package com.boman.common.core.utils;

import javax.servlet.http.HttpServletRequest;

import com.google.common.base.Preconditions;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import com.boman.domain.constant.CacheConstants;
import com.boman.common.core.text.Convert;

/**
 * 权限获取工具类
 * 
 * @author ruoyi
 */
public class SecurityUtils
{
    /**
     * 获取用户
     */
    public static String getUsername()
    {
        String username = ServletUtils.getRequest().getHeader(CacheConstants.DETAILS_USERNAME);
        return ServletUtils.urlDecode(username);
    }

    /**
     * 获取用户ID
     */
    public static Long getUserId()
    {
        return Convert.toLong(ServletUtils.getRequest().getHeader(CacheConstants.DETAILS_USER_ID));
    }

    /**
     * 获取请求token
     */
    public static String getToken()
    {
        return getToken(ServletUtils.getRequest());
    }

    /**
     * 根据request获取请求token
     */
    public static String getToken(HttpServletRequest request)
    {
        String token = ServletUtils.getRequest().getHeader(CacheConstants.HEADER);
        if (StringUtils.isNotEmpty(token) && token.startsWith(CacheConstants.TOKEN_PREFIX))
        {
            token = token.replace(CacheConstants.TOKEN_PREFIX, "");
        }
        return token;
    }

    /**
     * 是否为管理员
     * 
     * @param userId 用户ID
     * @return 结果
     */
    public static boolean isAdmin(Long userId)
    {
        return userId != null && 1L == userId;
    }

    /**
     * 生成BCryptPasswordEncoder密码
     *
     * @param password 密码
     * @return 加密字符串
     */
    public static String encryptPassword(String password)
    {
        BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
        return passwordEncoder.encode(password);
    }

    /**
     * 判断密码是否相同
     *
     * @param rawPassword 真实密码
     * @param encodedPassword 加密后字符
     * @return 结果
     */
    public static boolean matchesPassword(String rawPassword, String encodedPassword)
    {
        BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
        return passwordEncoder.matches(rawPassword, encodedPassword);
    }

    /**
     * @brief   检测密码复杂度是否为 强
     * @param[in] password  密码字符串
     * @return  符合长度要求 返回true
     */
    public static String checkStrongPwd(String pwd) {
        try {
            Preconditions.checkNotNull(pwd);
            if (!PwdCheckUtil.checkPasswordLength(pwd, "8", null)
                    || !PwdCheckUtil.checkContainLowerCase(pwd)
                    || !PwdCheckUtil.checkContainUpperCase(pwd)
                    || !PwdCheckUtil.checkContainDigit(pwd)
                    || !PwdCheckUtil.checkContainSpecialChar(pwd)
            ) {
                return "1";
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return "0";
    }
}
