import 'package:encrypt/encrypt.dart' as encrypt;
import 'package:flutter/foundation.dart';

import '../../constant/box_name.dart';
import '../../main.dart';

class EncryptionHelper {
  static EncryptionHelper? _instance;

  late final encrypt.Key key;
  late final encrypt.IV iv;

  EncryptionHelper._(this.key, this.iv);
  static EncryptionHelper get instance {
    if (_instance == null) {
      throw Exception(
          "EncryptionHelper is not initialized. Call `await EncryptionHelper.initialize()` in main.");
    }
    return _instance!;
  }

  /// Initializes and stores the instance globally
  static Future<void> initialize() async {
    if (_instance != null) {
      debugPrint("EncryptionHelper is already initialized.");
      return; // Prevent re-initialization
    }
    debugPrint("Initializing EncryptionHelper...");
    // Read stored keys
    String? keyOfApp = await storage.read(key: BoxName.keyOfApp);
    // Log.print('keyOfApp: ${keyOfApp}');
    String? initializationVector =
        await storage.read(key: BoxName.initializationVector);
    // Log.print('initializationVector: ${initializationVector}');
    // Set the global instance
    _instance = EncryptionHelper._(
      encrypt.Key.fromUtf8(keyOfApp!),
      encrypt.IV.fromUtf8(initializationVector!),
    );
    debugPrint("EncryptionHelper initialized successfully.");
  }

  /// Encrypts a string
  String encryptData(String plainText) {
    try {
      final encrypter =
          encrypt.Encrypter(encrypt.AES(key, mode: encrypt.AESMode.cbc));
      final encrypted = encrypter.encrypt(plainText, iv: iv);
      return encrypted.base64;
    } catch (e) {
      debugPrint('Encryption Error: $e');
      return '';
    }
  }

  /// Decrypts a string
  String decryptData(String encryptedText) {
    try {
      final encrypter =
          encrypt.Encrypter(encrypt.AES(key, mode: encrypt.AESMode.cbc));
      final encrypted = encrypt.Encrypted.fromBase64(encryptedText);
      return encrypter.decrypt(encrypted, iv: iv);
    } catch (e) {
      debugPrint('Decryption Error: $e');
      return '';
    }
  }
}
