package cn.van.business.util;

import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import io.jsonwebtoken.security.Keys;
import org.springframework.stereotype.Component;

import java.util.Date;

/**
 * JWT 工具类
 * 提供 token 的生成、解析、验证和有效期管理功能
 */
@Component
public class JwtUtils {

    private final String secret = "7b4c86d11fe2b64a5ce4d7d83de881b4afa76bf4a8bbc13ee50676c20b14c0835dda8a78a5a795b0f2201a26f758301b56ffbc52d021e158f1365d8be22fa6d7"; // 应配置在 application.yml 中
    private final long expiration = 86400000 * 7; // 24小时

    /**
     * 生成一个新的 JWT Token
     * @param username 用户名
     * @param roles    用户角色（可选）
     * @return 返回生成的 JWT Token 字符串
     */
// 生成 Token 时去掉 roles 参数
    public String generateToken(String username) {
        return Jwts.builder()
                .setSubject(username)
                .setExpiration(new Date(System.currentTimeMillis() + expiration))
                .signWith(SignatureAlgorithm.HS512, secret)
                .compact();
    }


    /**
     * 从给定的 JWT Token 中提取用户名
     *
     * @param token JWT Token
     * @return 提取的用户名
     */
    public String extractUsername(String token) {
        return Jwts.parser()
                .setSigningKey(secret)
                .parseClaimsJws(token)
                .getBody()
                .getSubject();
    }

    /**
     * 获取 JWT Token 的过期时间
     *
     * @param token JWT Token
     * @return 返回 token 的过期时间 (Date)
     */
    public Date extractExpiration(String token) {
        return Jwts.parser()
                .setSigningKey(secret)
                .parseClaimsJws(token)
                .getBody()
                .getExpiration();
    }

    /**
     * 验证指定的 JWT Token 是否有效
     *
     * @param token JWT Token
     * @return 如果 token 有效则返回 true，否则返回 false
     */
    public Boolean validateToken(String token) {
        return !isTokenExpired(token);
    }


    /**
     * 检查 token 是否已过期
     *
     * @param token JWT Token
     * @return 如果已过期返回 true，否则返回 false
     */
    private Boolean isTokenExpired(String token) {
        return extractExpiration(token).before(new Date());
    }

    /**
     * 获取 JWT Token 的剩余有效时间（毫秒）
     *
     * @param token JWT Token
     * @return 剩余的有效时间（毫秒）
     */
    public long getRemainingExpirationTime(String token) {
        long now = System.currentTimeMillis();
        return Math.max(0, extractExpiration(token).getTime() - now);
    }

    /**
     * 获取 JWT Token 的过期时间（毫秒）
     *
     * @param token JWT Token
     * @return 返回 token 的过期时间戳（毫秒）
     */
    public long getExpiration(String token) {
        return extractExpiration(token).getTime();
    }

}
