import { Injectable } from "@nestjs/common";
import { createPublicKey } from "node:crypto";
import { getJwtKeyPair } from "../config/jwt.js";

/**
 * JWK Set 项（RFC 7517 / RFC 7518 RS256）。
 */
export interface Jwk {
  kty: "RSA";
  use: "sig";
  alg: "RS256";
  kid: string;
  n: string; // modulus base64url
  e: string; // exponent base64url
}

export interface JwksResponse {
  keys: Jwk[];
}

/**
 * JWKS 服务（president §2.15 + I7 裁决）。
 *
 * 将 RS256 公钥 PEM 转换为 JWK 格式，供 api-gateway 拉取验签。
 * 端点：GET /iam/v1/.well-known/jwks.json
 *
 * 使用 Node.js 内置 crypto 模块的 export({ format: 'jwk' })，
 * 无需额外依赖。
 */
@Injectable()
export class JwksService {
  /**
   * 返回 JWK Set。当前仅单密钥，结构预留多密钥轮换能力。
   */
  getJwks(): JwksResponse {
    const keyPair = getJwtKeyPair();
    const publicKeyObj = createPublicKey(keyPair.publicKey);
    const jwk = publicKeyObj.export({ format: "jwk" }) as Record<
      string,
      unknown
    >;

    // Node export 返回 { kty, n, e }，补全 use/alg/kid
    return {
      keys: [
        {
          kty: jwk.kty as "RSA",
          use: "sig",
          alg: "RS256",
          kid: keyPair.kid,
          n: jwk.n as string,
          e: jwk.e as string,
        },
      ],
    };
  }

  /**
   * 返回公钥 PEM（供 gRPC GetPublicKey RPC 使用）。
   */
  getPublicKeyPem(): { kid: string; alg: string; publicKeyPem: string } {
    const keyPair = getJwtKeyPair();
    return {
      kid: keyPair.kid,
      alg: keyPair.alg,
      publicKeyPem: keyPair.publicKey,
    };
  }
}
