package com.zjrs.zwnw.auth.util;

import io.jsonwebtoken.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

import java.util.Date;
import java.util.HashMap;
import java.util.Map;

/**
 * JWT 工具类（HMAC-SHA256）
 * 使用 jjwt 0.9.1 API
 */
@Component
public class JwtUtil {

    private static final Logger log = LoggerFactory.getLogger(JwtUtil.class);

    /** Token 有效期：4小时（秒） */
    private static final long EXPIRE_SECONDS = 4 * 60 * 60;

    /**
     * HMAC 密钥（生产环境应从配置文件读取）
     */
    private static final String SECRET = "zjrs-zwnw-service-2019-auth-key-xK9mP3qR7vZ1nL5wY8eA";

    /**
     * 生成 JWT Token
     */
    public String generateToken(String loginId, String userName, String operid, Long operunitid) {
        Map<String, Object> claims = new HashMap<>();
        claims.put("loginId", loginId);
        claims.put("userName", userName);
        claims.put("operid", operid);
        claims.put("operunitid", operunitid);

        Date now = new Date();
        Date expiry = new Date(now.getTime() + EXPIRE_SECONDS * 1000L);

        return Jwts.builder()
                .setClaims(claims)
                .setSubject(loginId)
                .setIssuedAt(now)
                .setExpiration(expiry)
                .signWith(SignatureAlgorithm.HS256, SECRET.getBytes())
                .compact();
    }

    /**
     * 解析 Token，失败返回 null
     */
    public Claims parseToken(String token) {
        try {
            return Jwts.parser()
                    .setSigningKey(SECRET.getBytes())
                    .parseClaimsJws(token)
                    .getBody();
        } catch (ExpiredJwtException e) {
            log.warn("Token 已过期: {}", e.getMessage());
        } catch (JwtException e) {
            log.warn("Token 解析失败: {}", e.getMessage());
        }
        return null;
    }

    /** 校验 Token 是否有效 */
    public boolean isValid(String token) {
        return parseToken(token) != null;
    }

    /** 获取 Token 有效期（秒） */
    public long getExpireSeconds() {
        return EXPIRE_SECONDS;
    }
}
