import CryptoJS from 'crypto-js';

/**
 * MD5 哈希
 * @param str 待加密字符串
 */
export function md5(str: string): string {
  return CryptoJS.MD5(str).toString();
}

/**
 * SHA256 哈希
 * @param str 待加密字符串
 */
export function sha256(str: string): string {
  return CryptoJS.SHA256(str).toString();
}

/**
 * SHA1 哈希
 * @param str 待加密字符串
 */
export function sha1(str: string): string {
  return CryptoJS.SHA1(str).toString();
}

/**
 * Base64 编码
 * @param str 待编码字符串
 */
export function base64Encode(str: string): string {
  const wordArray = CryptoJS.enc.Utf8.parse(str);
  return CryptoJS.enc.Base64.stringify(wordArray);
}

/**
 * Base64 解码
 * @param str 待解码 Base64 字符串
 */
export function base64Decode(str: string): string {
  const wordArray = CryptoJS.enc.Base64.parse(str);
  return CryptoJS.enc.Utf8.stringify(wordArray);
}

/**
 * AES 加密（CBC 模式，PKCS7 填充）
 * @param data 待加密数据
 * @param key  密钥
 * @param iv   偏移量
 */
export function aesEncrypt(
  data: string,
  key: string,
  iv: string,
): string {
  const keyWordArray = CryptoJS.enc.Utf8.parse(key);
  const ivWordArray = CryptoJS.enc.Utf8.parse(iv);
  const encrypted = CryptoJS.AES.encrypt(data, keyWordArray, {
    iv: ivWordArray,
    mode: CryptoJS.mode.CBC,
    padding: CryptoJS.pad.Pkcs7,
  });
  return encrypted.toString();
}

/**
 * AES 解密（CBC 模式，PKCS7 填充）
 * @param encryptedData 密文（Base64）
 * @param key           密钥
 * @param iv            偏移量
 */
export function aesDecrypt(
  encryptedData: string,
  key: string,
  iv: string,
): string {
  const keyWordArray = CryptoJS.enc.Utf8.parse(key);
  const ivWordArray = CryptoJS.enc.Utf8.parse(iv);
  const decrypted = CryptoJS.AES.decrypt(encryptedData, keyWordArray, {
    iv: ivWordArray,
    mode: CryptoJS.mode.CBC,
    padding: CryptoJS.pad.Pkcs7,
  });
  return CryptoJS.enc.Utf8.stringify(decrypted);
}

/**
 * HMAC-SHA256 签名
 * @param data 待签名数据
 * @param key  密钥
 */
export function hmacSha256(data: string, key: string): string {
  return CryptoJS.HmacSHA256(data, key).toString();
}

export default CryptoJS;