import 'package:platform_encryption/platform_encryption.dart';
import 'package:platform_contracts/contracts.dart';

void main() {
  // Generate a key for AES-256-CBC
  final key = Encrypter.generateKey('aes-256-cbc');
  print('Generated key: $key');

  // Create an Encrypter instance
  final encrypter = Encrypter(key, cipher: 'aes-256-cbc');

  // Example 1: Encrypting and decrypting a string
  const originalString = 'Hello, Protevus Platform!';
  print('\nExample 1: String encryption');
  print('Original: $originalString');

  final encryptedString = encrypter.encryptString(originalString);
  print('Encrypted: $encryptedString');

  final decryptedString = encrypter.decryptString(encryptedString);
  print('Decrypted: $decryptedString');

  // Example 2: Encrypting and decrypting an object
  final originalObject = {
    'username': 'john_doe',
    'email': 'john@example.com',
    'age': 30,
  };
  print('\nExample 2: Object encryption');
  print('Original: $originalObject');

  final encryptedObject = encrypter.encrypt(originalObject);
  print('Encrypted: $encryptedObject');

  final decryptedObject = encrypter.decrypt(encryptedObject);
  print('Decrypted: $decryptedObject');

  // Example 3: Handling encryption exceptions
  print('\nExample 3: Handling exceptions');
  try {
    encrypter.encrypt(null);
  } on EncryptException catch (e) {
    print('Caught EncryptException: $e');
  }

  // Example 4: Handling decryption exceptions
  try {
    encrypter.decrypt('invalid_payload');
  } on DecryptException catch (e) {
    print('Caught DecryptException: $e');
  }

  // Example 5: Using previous keys
  print('\nExample 5: Using previous keys');
  final oldKey = Encrypter.generateKey('aes-256-cbc');
  final newKey = Encrypter.generateKey('aes-256-cbc');

  final oldEncrypter = Encrypter(oldKey, cipher: 'aes-256-cbc');
  final encryptedWithOldKey = oldEncrypter.encryptString('Secret message');
  print('Encrypted with old key: $encryptedWithOldKey');

  final newEncrypter =
      Encrypter(newKey, cipher: 'aes-256-cbc', previousKeys: [oldKey]);
  final decryptedWithNewEncrypter =
      newEncrypter.decryptString(encryptedWithOldKey);
  print('Decrypted with new encrypter: $decryptedWithNewEncrypter');
}