/**
 * RSA 加密工具
 * 使用 jsencrypt 库进行 RSA 公钥加密
 */

// 导入 jsencrypt
import JSEncrypt from 'jsencrypt'

// RSA 公钥（Base64 格式，不带 BEGIN/END 标记）
const RSA_PUBLIC_KEY_BASE64 = `MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsQVIKYozXCfnXUw8+omYLdcdL1pTzmQh35YPsvn22wM4SQJKvMmXmcS6bI5Bu+5zCjL0F56DzfKz0BNZEwb46UshUOO+KFBUr8CxjYE8NOgIsoe5FUn57O6er9/KySaWlkpGZX49K+l3e90R+dFUEfRE/ijYpeZWkLRwcgWZ+2u6HGpl9h/eF6XD0aW9asDjdAbxUQ48TlaWgfP+OHC+Zy2GKGQG16EcDMczrN6a2HbFnwRIUKrFP67UqyRq11BTUziOhXLY8J0MFuwXUk2OY4VpqjrJjHHjlHYADjIL/5K4Io2AhRU9+QSsKFR2wGxi4e8vw2IXDzscrDuah/7YSwIDAQAB`

// RSA 公钥（PEM 格式）
const RSA_PUBLIC_KEY = `-----BEGIN PUBLIC KEY-----
${RSA_PUBLIC_KEY_BASE64}
-----END PUBLIC KEY-----`

/**
 * 获取 JSEncrypt 构造函数
 * @returns {Function} JSEncrypt 构造函数
 */
function getJSEncrypt() {
  // 优先使用已导入的 JSEncrypt
  if (JSEncrypt) {
    return JSEncrypt
  }
  
  // 尝试从全局获取（可能通过 CDN 引入）
  if (typeof window !== 'undefined' && window.JSEncrypt) {
    return window.JSEncrypt
  }
  
  return null
}

/**
 * RSA 加密函数（同步版本）
 * @param {string} plainText - 要加密的明文
 * @returns {string|null} 加密后的密文（Base64 编码），失败返回 null
 */
export function rsaEncryptSync(plainText) {
  if (!plainText || typeof plainText !== 'string') {
    console.error('RSA 加密：输入必须是非空字符串')
    return null
  }

  try {
    const Encrypt = getJSEncrypt()
    if (!Encrypt) {
      console.error('JSEncrypt 未加载')
      return null
    }

    const encrypt = new Encrypt()
    encrypt.setPublicKey(RSA_PUBLIC_KEY)
    const encrypted = encrypt.encrypt(plainText)
    
    if (!encrypted) {
      console.error('RSA 加密失败：返回值为空')
      return null
    }
    
    return encrypted
  } catch (error) {
    console.error('RSA 加密异常:', error)
    return null
  }
}

/**
 * RSA 加密函数（异步版本，兼容同步调用）
 * @param {string} plainText - 要加密的明文
 * @returns {Promise<string|null>} 加密后的密文（Base64 编码），失败返回 null
 */
export async function rsaEncrypt(plainText) {
  if (!plainText || typeof plainText !== 'string') {
    console.error('RSA 加密：输入必须是非空字符串')
    return null
  }

  try {
    const Encrypt = getJSEncrypt()
    if (!Encrypt) {
      console.error('JSEncrypt 未加载')
      return null
    }

    const encrypt = new Encrypt()
    encrypt.setPublicKey(RSA_PUBLIC_KEY)
    const encrypted = encrypt.encrypt(plainText)
    
    if (!encrypted) {
      console.error('RSA 加密失败：返回值为空')
      return null
    }
    
    return encrypted
  } catch (error) {
    console.error('RSA 加密异常:', error)
    return null
  }
}
