import 'dart:convert';
import 'dart:typed_data';
import 'package:encrypt/encrypt.dart' as enc;
import 'package:archive/archive.dart';

class EncryptionUtil {
  // 固定密钥（和后端保持一致）
  static const String _keyStr = ",Lscj312.;[]sc`1dsajcjc;;wislacx";
  static const String _ivStr = ",>ew:[7890;,wd[2";

  // 对外简易方法（你 Service / Provider 里直接用）
  static String encrypt(String data) => encryptAndCompress(data);
  static String decrypt(String encryptedBase64) => decompressAndDecrypt(encryptedBase64);

  /// 加密：字符串 → GZIP → AES → Base64
  static String encryptAndCompress(String plainText) {
    // 强制 32位 Key / 16位 IV（AES 标准）
    final key = enc.Key.fromUtf8(_keyStr.padRight(32).substring(0, 32));
    final iv = enc.IV.fromUtf8(_ivStr.padRight(16).substring(0, 16));
    final encrypter = enc.Encrypter(enc.AES(key, mode: enc.AESMode.cbc));

    // GZIP 压缩
    final utf8Bytes = utf8.encode(plainText);
    final compressed = GZipEncoder().encode(utf8Bytes)!;

    // AES 加密
    final encrypted = encrypter.encryptBytes(
      Uint8List.fromList(compressed),
      iv: iv,
    );

    return encrypted.base64;
  }

  /// 解密：Base64 → AES → GZIP → 字符串
  static String decompressAndDecrypt(String encryptedBase64) {
    final key = enc.Key.fromUtf8(_keyStr.padRight(32).substring(0, 32));
    final iv = enc.IV.fromUtf8(_ivStr.padRight(16).substring(0, 16));
    final encrypter = enc.Encrypter(enc.AES(key, mode: enc.AESMode.cbc));

    // 解密
    final encrypted = enc.Encrypted.fromBase64(encryptedBase64);
    final decryptedBytes = encrypter.decryptBytes(encrypted, iv: iv);

    // GZIP 解压
    final decompressed = GZipDecoder().decodeBytes(decryptedBytes);

    return utf8.decode(decompressed);
  }
}