package cn.meowrain.aioj.backend.auth.utils;

import cn.meowrain.aioj.backend.auth.dto.resp.UserAuthRespDTO;
import cn.meowrain.aioj.backend.framework.security.utils.JwtUtil;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Component;

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

/**
 * Auth Service 专用的 JWT 工具类
 * 包装 common-security 中的 JwtUtil，提供接受 UserAuthRespDTO 的便捷方法
 */
@Component
@RequiredArgsConstructor
public class AuthServiceJwtUtil {

	private final JwtUtil jwtUtil;

	/**
	 * 生成 Access Token
	 * @param user 用户信息
	 * @return JWT Token
	 */
	public String generateAccessToken(UserAuthRespDTO user) {
		Map<String, Object> claims = new HashMap<>();
		claims.put("userId", user.getId());
		claims.put("userName", user.getUserName());
		claims.put("role", user.getUserRole());
		return jwtUtil.generateAccessToken(user.getId(), claims);
	}

	/**
	 * 生成 Refresh Token
	 * @param userId 用户ID
	 * @return JWT Token
	 */
	public String generateRefreshToken(Long userId) {
		return jwtUtil.generateRefreshToken(userId);
	}

	/**
	 * 生成 OIDC ID Token
	 * @param user 用户信息
	 * @param clientId 客户端ID（aud）
	 * @param nonce 防重放参数
	 * @return ID Token
	 */
	public String generateIdToken(UserAuthRespDTO user, String clientId, String nonce) {
		Map<String, Object> claims = new HashMap<>();
		claims.put("aud", clientId);
		claims.put("name", user.getUserName());
		claims.put("preferred_username", user.getUserAccount());
		if (nonce != null) {
			claims.put("nonce", nonce);
		}
		return jwtUtil.generateAccessToken(user.getId(), claims);
	}

	/**
	 * 校验 Token 是否过期
	 */
	public boolean isTokenValid(String token) {
		return jwtUtil.isTokenValid(token);
	}

	/**
	 * 解析 Token
	 */
	public io.jsonwebtoken.Claims parseClaims(String token) {
		return jwtUtil.parseClaims(token);
	}

}
