/// SDK API
/// 端對端加密的統一入口
library;

import 'package:cipher_guard_sdk/src/domain/entities/rsa_key_pair.dart';
import 'package:cipher_guard_sdk/src/domain/entities/session_key.dart';
import 'package:cipher_guard_sdk/src/domain/entities/encrypted_message.dart';
import 'package:cipher_guard_sdk/src/presentation/wiring/cipher_guard_sdk_wiring.dart';

abstract class CipherGuardSdkApi {
  factory CipherGuardSdkApi() => CipherGuardSdkWiring.build();

  // ==================== 平台版本 ====================

  /// 獲取平台版本
  Future<String?> platformVersion();

  // ==================== RSA 金鑰管理 ====================

  /// 生成 RSA 金鑰對
  Future<RsaKeyPair> generateRsaKeyPair({int keySize = 1024});

  /// 用密碼加密私鑰
  Future<String> encryptPrivateKey({
    required String privateKey,
    required String password,
  });

  /// 解密私鑰
  Future<String> decryptPrivateKey({
    required String encryptedPrivateKey,
    required String password,
  });

  // ==================== 會話金鑰管理 ====================

  /// 生成 AES 會話金鑰
  Future<SessionKey> generateSessionKey({int initialRound = 1});

  /// 用 RSA 公鑰加密會話金鑰
  Future<String> encryptSessionKey({
    required String sessionKey,
    required String publicKey,
  });

  /// 用 RSA 私鑰解密會話金鑰
  Future<String> decryptSessionKey({
    required String encryptedSessionKey,
    required String privateKey,
  });

  // ==================== 訊息加解密 ====================

  /// 加密訊息
  Future<EncryptedMessage> encryptMessage({
    required String plaintext,
    required String sessionKey,
    required int round,
  });

  /// 解密訊息
  Future<String> decryptMessage({
    required String encryptedData,
    required String sessionKey,
    required int round,
  });

  // ==================== 活跃密钥注册 ====================

  /// 注册当前用户的 RSA 密钥对（登录后调用一次，内存持久化）
  ///
  /// 登录成功后从安全存储 / keychain 取出密钥对，调用此方法注入 SDK。
  /// 后续 [encryptSessionKeyWithActiveKey] / [decryptSessionKeyWithActiveKey]
  /// 直接使用内存中的密钥，不再需要调用方每次传参，也不再重复读文件。
  ///
  /// 退出登录时调用 [clearActiveKeyPair]。
  void setActiveKeyPair({
    required String publicKey,
    required String privateKey,
  });

  /// 清除内存中的活跃密钥对（退出登录时调用）
  void clearActiveKeyPair();

  /// 用内存中的 RSA 公钥加密 session key
  ///
  /// 等价于 [encryptSessionKey]，但无需每次传 publicKey。
  /// 调用前必须先调 [setActiveKeyPair]，否则抛 [StateError]。
  Future<String> encryptSessionKeyWithActiveKey({required String sessionKey});

  /// 用内存中的 RSA 私钥解密 session key
  ///
  /// 等价于 [decryptSessionKey]，但无需每次传 privateKey。
  /// 调用前必须先调 [setActiveKeyPair]，否则抛 [StateError]。
  Future<String> decryptSessionKeyWithActiveKey({
    required String encryptedSessionKey,
  });

  // ==================== 缓存管理 ====================

  /// 清空内部缓存（RSA 解析缓存等）
  ///
  /// session key 轮换或退出登录时可调用。
  /// 消息加解密使用 raw key（无 KDF），此方法主要清理 RSA 缓存。
  void clearCaches();

  // ==================== 原生平台同步 ====================

  /// 同步加密金鑰到原生平台 (iOS App Group)
  Future<void> syncEncryptionKey({
    required String chatId,
    required int activeRound,
    required int round,
    required String activeKey,
    required bool isSingle,
  });

  /// 批量同步所有加密聊天室的金鑰
  Future<void> syncAllEncryptionKeys({
    required Map<String, Map<String, dynamic>> chatMap,
  });

  // ==================== 推送通知解密 ====================

  /// 設置 AES_SECRET (用於推送解密)
  Future<void> setAesSecret({required String aesSecret});

  /// 解密 APNS 推送通知內容
  Future<String?> decryptPushNotification({required String encryptedData});
}
