import CryptoJS from 'crypto-js'
import MD5 from 'crypto-js/md5'
import AES from 'crypto-js/aes'

// 加密配置接口
export interface EncryptionConfig {
  // 是否启用加密
  enabled: boolean
  // MD5 混淆固定字符串
  md5Salt: string
  // AES 偏移量
  aesIv: string
  // 请求头中标识加密的字段名
  encryptHeader: string
}

// 默认加密配置
export const DEFAULT_ENCRYPTION_CONFIG: EncryptionConfig = {
  enabled: false,
  md5Salt: 'Q8pD09kIeWXg8Ju',
  aesIv: 'dFd8s4fDfV6d2fsD',
  encryptHeader: 'encrypt',
}

/**
 * 生成加密密钥
 * @param token 用户token
 * @param salt MD5混淆字符串
 * @returns 加密密钥
 */
export function generateEncryptionKey(token: string, salt: string): string {
  // 取token前32位 + 固定字符串，生成MD5密钥
  const keyString = `${token.slice(0, 32)}${salt}`
  return MD5(keyString).toString().toUpperCase()
}

/**
 * AES 加密数据
 * @param data 要加密的数据
 * @param token 用户token
 * @param config 加密配置
 * @returns 加密后的数据
 */
export function encryptData(data: any, token: string, config: EncryptionConfig): { key: string } {
  if (!config.enabled || !data || !token) {
    return data
  }

  try {
    // 生成加密密钥
    const key = generateEncryptionKey(token, config.md5Salt)
    const secret = CryptoJS.enc.Utf8.parse(key)
    const iv = CryptoJS.enc.Utf8.parse(config.aesIv)

    // 将数据转换为JSON字符串
    const content = JSON.stringify(data)

    // AES 加密
    const encryptedData = AES.encrypt(content, secret, { iv })

    // 返回加密后的数据格式
    return { key: encryptedData.toString() }
  } catch (error) {
    console.error('Encryption failed:', error)
    // 加密失败时返回原始数据
    return data
  }
}

/**
 * 检查请求是否需要加密
 * @param data 请求数据
 * @param config 加密配置
 * @returns 是否需要加密
 */
export function shouldEncryptRequest(data: any, config: EncryptionConfig): boolean {
  if (!config.enabled) {
    return false
  }

  // 只有POST/PUT/PATCH请求且有数据时才加密
  return data !== undefined && data !== null
}
