package com.trade.common.token;

import com.trade.common.constant.CacheConstants;
import com.trade.common.constant.Constants;
import com.trade.common.utils.StringUtils;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import java.util.Arrays;
import java.util.Map;

/**
 * @description:
 * @Author: wanglang
 * @Date: 2024/4/2 10:18
 * @Version: 1.0
 */
public class TokenUtils {

    /**
     * 从令牌中获取用户名
     *
     * @param token 令牌
     * @param secret 令牌秘钥
     * @return 用户名
     */
    public static String getUsernameFromToken(String token, String secret) {
        Claims claims = parseToken(token, secret);
        return claims.getSubject();
    }

    /**
     * 从数据声明生成令牌
     *
     * @param claims 数据声明
     * @param secret 令牌秘钥
     * @return 令牌
     */
    public static String createToken(Map<String, Object> claims, String secret) {
        String token = Jwts.builder().setClaims(claims).signWith(SignatureAlgorithm.HS512, secret).compact();
        return token;
    }

    /**
     * 从令牌中获取数据声明
     *
     * @param token 令牌
     * @return 数据声明
     */
    public static Claims parseToken(String token, String secret) {
        return Jwts.parser().setSigningKey(secret).parseClaimsJws(token).getBody();
    }

    /**
     * 获取请求token
     *
     * @param request
     * @param header
     * @param flag true从C端取，false从B端取
     * @return token
     */
    public static String getToken(HttpServletRequest request, String header, boolean flag) {
        String token = request.getHeader(header);
        // if (StringUtils.isEmpty(token)) {
        // if (request.getCookies() == null || request.getCookies().length == 0) {
        // return token;
        // }
        // Cookie cookie;
        // if (flag) {
        // cookie = Arrays.stream(request.getCookies()).filter(c -> Constants.C_COOKIN_NAME.equals(c.getName()))
        // .findAny().orElse(null);
        // } else {
        // cookie = Arrays.stream(request.getCookies()).filter(c -> Constants.B_COOKIN_NAME.equals(c.getName()))
        // .findAny().orElse(null);
        // }
        // if (cookie != null) {
        // token = Constants.TOKEN_PREFIX + cookie.getValue();
        // }
        // }
        if (StringUtils.isNotEmpty(token) && token.startsWith(Constants.TOKEN_PREFIX)) {
            token = token.replace(Constants.TOKEN_PREFIX, "");
        }
        return token;
    }

    public static String getTokenKey(String uuid) {
        return CacheConstants.LOGIN_TOKEN_KEY + uuid;
    }
}
