"""
PROJECT-PX1: Double Ratchet & X3DH Python Library

This package provides secure messaging primitives using Double Ratchet and X3DH algorithms.
It exposes all main classes and interfaces required for key agreement (X3DH) and ratcheted encryption (Double Ratchet).

Modules:
- double_ratchet: Double Ratchet protocol, message/session management, and interfaces.
- x3dh: X3DH protocol, key bundles, models, and state management.

Usage:
    from project_px1 import (
        DRSession, DRSessionHE, State, DHKeyPair, DHPublicKey,
        AES256CBCHMAC, AES256GCM, MsgKeyStorage, RootChain, SymmetricChain,
        Ratchet, RatchetHE,
        # X3DH classes
        Bundle, Header as X3DHHeader, IdentityKeyPair, IdentityKeyPairPriv, IdentityKeyPairSeed,
        SignedPreKeyPair, PreKeyPair,
        State as X3DHState,
        IdentityKeyFormat, HashFunction, SecretType,
        KeyAgreementException,
    )
"""

# Double Ratchet Exports
from .double_ratchet import (
    DRSession, DRSessionHE,
    State,
    DHKeyPair, DHPublicKey,
    AES256CBCHMAC, AES256GCM,
    MsgKeyStorage, RootChain, SymmetricChain,
    Ratchet, RatchetHE,
    Header as DoubleRatchetHeader,
    Message, MessageHE,
    MaxSkippedMksExceeded,
    AuthenticationFailed,
)

# X3DH Exports
from .x3dh import (
    Bundle, Header as X3DHHeader,
    IdentityKeyPair, IdentityKeyPairPriv, IdentityKeyPairSeed,
    SignedPreKeyPair, PreKeyPair,
    State as X3DHState,
    IdentityKeyFormat, HashFunction, SecretType,
    KeyAgreementException,
)

__all__ = [
    # Double Ratchet
    "DRSession", "DRSessionHE", "State", "DHKeyPair", "DHPublicKey",
    "AES256CBCHMAC", "AES256GCM", "MsgKeyStorage", "RootChain", "SymmetricChain",
    "Ratchet", "RatchetHE", "DoubleRatchetHeader", "Message", "MessageHE", "MaxSkippedMksExceeded",
    "AuthenticationFailed",
    # X3DH
    "Bundle", "X3DHHeader", "IdentityKeyPair", "IdentityKeyPairPriv", "IdentityKeyPairSeed",
    "SignedPreKeyPair", "PreKeyPair", "X3DHState", "IdentityKeyFormat", "HashFunction",
    "SecretType", "KeyAgreementException",
]
