import JSEncrypt from 'jsencrypt' // RSA 加密
import CryptoJS from 'crypto-js' // AES 加密
import request from '@/utils/request'

/**
 * 获取后端 RSA 公钥
 */
export function getRsaPublicKey(){
  return request({
    url: '/crypto/publicKey',
    headers: {
      isToken: false,
      repeatSubmit: false
    },
    method: 'get'
  })
}

export function getIsKey(){
  // return {'data':'1'}
  return request({
    url: '/crypto/isKey',
    headers: {
      isToken: false,
      repeatSubmit: false
    },
    method: 'get'
  })
}

/**
 * 生成随机 AES 密钥（16 位 Base64 编码，符合 AES-128 要求）
 */
export const generateAesKey = () => {
  // 生成 16 位随机字符串（Base64 编码后长度为 24，可直接作为密钥）
  const randomWord = CryptoJS.lib.WordArray.random(16)
  return CryptoJS.enc.Base64.stringify(randomWord)
}

/**
 * RSA 加密（用公钥加密内容）
 * @param {string} content - 要加密的内容（如 AES 密钥）
 * @param {string} publicKey - RSA 公钥
 */
export const rsaEncrypt = (content, publicKey) => {
  const encryptor = new JSEncrypt()
  encryptor.setPublicKey(publicKey)
  // 加密后返回 Base64 编码的字符串
  return encryptor.encrypt(content)
}

/**
 * AES 加密（CBC 模式）
 * @param {object} data - 业务数据（如登录参数）
 * @param {string} aesKey - AES 密钥（Base64 编码）
 */
export const aesEncrypt = (data, aesKey) => {
  const key = CryptoJS.enc.Base64.parse(aesKey)
  const iv = CryptoJS.enc.Base64.parse(aesKey) // 简化：IV 与密钥相同（生产环境可单独生成）
  // 先将对象转为 JSON 字符串，再加密
  const jsonStr = JSON.stringify(data)
  const cipher = CryptoJS.AES.encrypt(jsonStr, key, {
    iv: iv,
    mode: CryptoJS.mode.CBC,
    padding: CryptoJS.pad.Pkcs7
  })
  // 返回 Base64 编码的密文
  return cipher.toString()
}

/**
 * AES 解密（用于解密后端响应的加密数据）
 * @param {string} encryptStr - 加密后的字符串
 * @param {string} aesKey - AES 密钥
 */
export const aesDecrypt = (encryptStr, aesKey) => {
  const key = CryptoJS.enc.Base64.parse(aesKey)
  const iv = CryptoJS.enc.Base64.parse(aesKey)
  const cipher = CryptoJS.AES.decrypt(encryptStr, key, {
    iv: iv,
    mode: CryptoJS.mode.CBC,
    padding: CryptoJS.pad.Pkcs7
  })
  // 转换为 JSON 对象
  return JSON.parse(CryptoJS.enc.Utf8.stringify(cipher))
}
