//package jj.tech.paolu.utils;
//
//import java.time.Instant;
//import java.util.Base64;
//import java.util.Date;
//import java.util.HashMap;
//import java.util.Map;
//
//import javax.crypto.SecretKey;
//import javax.crypto.spec.SecretKeySpec;
//
//import com.fasterxml.jackson.databind.ObjectMapper;
//
//import io.jsonwebtoken.Claims;
//import io.jsonwebtoken.CompressionCodecs;
//import io.jsonwebtoken.Jws;
//import io.jsonwebtoken.JwtBuilder;
//import io.jsonwebtoken.JwtParser;
//import io.jsonwebtoken.Jwts;
//import io.jsonwebtoken.jackson.io.JacksonDeserializer;
//import io.jsonwebtoken.jackson.io.JacksonSerializer;
//import org.apache.commons.lang3.StringUtils;
//import org.apache.commons.lang3.time.DateUtils;
//import org.slf4j.Logger;
//import org.slf4j.LoggerFactory;
//
//public class JwtUtil {
////	public static final String HMACSHA256 = "HMACSHA256";
////	public static final String SECRET = "fn4hIX5+d29jYW8seWFtYWRpZSx3YW5kYW5sZX5+ISF+fg==";
////	public static final SecretKey DEFAULT_SECRET_KEY =  new SecretKeySpec(Base64.getDecoder().decode(SECRET), HMACSHA256);
//	
//	private static final Logger logger = LoggerFactory.getLogger(JwtUtil.class);
//	public static final SecretKey DEFAULT_SECRET_KEY = Jwts.SIG.HS512.key().build();
//	
//
//	private static final String CLAIM_KEY_CREATED = "created";
//
//	private static long exp = 30 * 60 * 1000; //过期时间,毫秒
//	
//	public static ObjectMapper objectMapper = new ObjectMapper();
//
//	/**
//	 * 根据负责生成JWT的token
//	 */
//	public static String generateToken(Map<String, Object> claims) {
//		
//		claims.put(CLAIM_KEY_CREATED, new Date());
//		JwtBuilder builder = Jwts.builder()
//				.claims(claims)
//				.compressWith(Jwts.ZIP.DEF)
//				.json(new JacksonSerializer(objectMapper))
//				.signWith(DEFAULT_SECRET_KEY);
//		if (exp > 0) {
//			long nowMillis = System.currentTimeMillis();
//			builder.expiration(new Date(nowMillis + exp));
//		}
//		return builder.compact();
//	}
//
//	/**
//	 * 当原来的token没过期时是可以刷新的
//	 *
//	 * @param oldToken 带tokenHead的token
//	 */
//	public static String refreshHeadToken(String oldToken) {
//		if(StringUtils.isEmpty(oldToken)){
//			return null;
//		}
//		//token校验不通过
//		Claims claims = getClaimsFromToken(oldToken);
//		if(claims==null){
//			return null;
//		}
//		//如果token已经过期，不支持刷新
//		Date expiredDate = claims.getExpiration();
//		if(expiredDate.before(new Date())){
//			return null;
//		}
//		//如果token在30分钟之内刚刷新过，返回原token
//		if(tokenRefreshJustBefore(oldToken,30*60)){
//			return oldToken;
//		}else{
//			claims.put(CLAIM_KEY_CREATED, new Date());
//			return generateToken(claims);
//		}
//	}
//
//	/**
//	 * 判断token在指定时间内是否刚刚刷新过
//	 * @param token 原token
//	 * @param time 指定时间（秒）
//	 */
//	public static boolean tokenRefreshJustBefore(String token, int time) {
//		Claims claims = getClaimsFromToken(token);
//		Date created = claims.get(CLAIM_KEY_CREATED, Date.class);
//		Date refreshDate = new Date();
//		//刷新时间在创建时间的指定时间内
//		if(refreshDate.after(created)&&refreshDate.before(DateUtils.addSeconds(created,time))){
//			return true;
//		}
//		return false;
//	}
//
//	/**
//	 * 从token中获取JWT中的负载
//	 */
//	public static Claims getClaimsFromToken(String token) {
//		Claims claims = null;
//		try {
//			byte[]  source = Jwts.parser()
//					.decryptWith(DEFAULT_SECRET_KEY)
//					.build()
//					.parseEncryptedContent(token)
//					.getPayload();
//		} catch (Exception e) {
//			logger.info("JWT格式验证失败:{}", token);
//		}
//		return claims;
//	}
//	/**
//	 * 通过token获取用户id
//	 * @param
//	 * @return
//	 */
////	public static String getUserId(String jwtStr){
////		Claims claims = JwtUtil.getClaimsFromToken(jwtStr);
////		JsonUtil.writeValueAsString(claims.get("user"));
////		UserInfo user = JsonUtil.readValueToObj(JsonUtil.writeValueAsString(claims.get("user")), UserInfo.class);
////		return user.
////	}
//
//
//	@SuppressWarnings({ "rawtypes", "unchecked" })
//	public JwtBuilder jwtBuilder() {
//		return Jwts.builder()
//				.compressWith(Jwts.ZIP.DEF)
//				.json(new JacksonSerializer(objectMapper))
//				.signWith(DEFAULT_SECRET_KEY);
//
//	}
//
//	@SuppressWarnings({ "rawtypes", "unchecked" })
//	public JwtParser jwtParser() {
//		return Jwts.parserBuilder()
//				.deserializeJsonWith(new JacksonDeserializer(objectMapper))
//				.setSigningKey(DEFAULT_SECRET_KEY)
//				.build();
//	}
//  
//	@SuppressWarnings("unchecked")
//	public static void main(String[] args) {
//		
//		JwtUtil jwtUtil = new JwtUtil();
//		jwtUtil.objectMapper = new ObjectMapper();
//		//Create the TOKEN
//		HashMap<String,String> b = new HashMap<String,String>();
//		b.put("x", "11");
//		b.put("y", "22");
//		Claims claim = Jwts.claims();
//		claim.put("a", "aa");
//		claim.put("b", b);
//		claim.setExpiration(Date.from(Instant.now().plusSeconds(3600L)));
//	           
//	    var encoder = jwtUtil.jwtBuilder().setClaims(claim).compact();
//	    System.out.println(encoder);
//	    
//	    //Decode the TOKEN
//	    var jwtParser = jwtUtil.jwtParser();
//	    jwtParser.isSigned(encoder);
//		Jws<Claims> claims =  (Jws<Claims>) jwtParser.parse(encoder);
//	    System.out.println(claims.getBody()); 
//	}
//}
