"""microsandbox — Python SDK for secure, fast microVM-based sandboxing."""

import os as _os

from microsandbox._microsandbox import (
    BackendInfo,
    ExecEvent,
    ExecHandle,
    ExecOutput,
    ExecSink,
    FsEntry,
    FsMetadata,
    FsReadStream,
    FsWriteSink,
    Image,
    ImageConfigDetail,
    ImageDetail,
    ImageHandle,
    ImageLayerDetail,
    ImagePruneReport,
    LogEntry,
    LogStream,
    MetricsStream,
    PullEvent,
    PullSession,
    Sandbox,
    SandboxFsOps,
    SandboxHandle,
    SandboxMetrics,
    SandboxPage,
    SandboxPingResult,
    SandboxSshOps,
    SandboxStopResult,
    SandboxTouchResult,
    SftpClient,
    Snapshot,
    SnapshotHandle,
    SshClient,
    SshOutput,
    SshServer,
    Volume,
    VolumeHandle,
    all_sandbox_metrics,
    backend_scope,
    default_backend_info,
    default_backend_kind,
    install,
    is_installed,
    set_default_backend,
    version,
)
from microsandbox._microsandbox import (
    set_runtime_libkrunfw_path as set_libkrunfw_path,
)
from microsandbox._microsandbox import (
    set_runtime_msb_path as _set_runtime_msb_path,
)
from microsandbox._runtime import msb_path as _msb_path
from microsandbox.agent import (
    FLAG_SESSION_START,
    FLAG_SHUTDOWN,
    FLAG_TERMINAL,
    AgentClient,
    AgentStream,
)
from microsandbox.errors import (
    CloudHttpError,
    ExecFailedError,
    ExecTimeoutError,
    FilesystemError,
    ImageInUseError,
    ImageNotFoundError,
    ImagePullFailedError,
    InvalidConfigError,
    IoError,
    MetricsDisabledError,
    MetricsUnavailableError,
    MicrosandboxError,
    NetworkPolicyError,
    NoDefaultCommandError,
    PathNotFoundError,
    SandboxAlreadyExistsError,
    SandboxNotFoundError,
    SandboxNotRunningError,
    SandboxStillRunningError,
    SecretViolationError,
    SnapshotMigrationError,
    TlsError,
    UnsupportedError,
    UnsupportedOperationError,
    VolumeNotFoundError,
)
from microsandbox.types import (
    Action,
    BackendKind,
    ChangeKind,
    ConfigPlannedChange,
    CpuPlacement,
    DeploymentProfile,
    DestGroup,
    Destination,
    Direction,
    DiskImageFormat,
    ExecEventType,
    ExecOptions,
    ExitStatus,
    FlatClone,
    FsEntryKind,
    GiB,
    HostPermissions,
    ImageArchiveFormat,
    ImageSource,
    ImageSourceKind,
    InitConfig,
    InitOptions,
    LogLevel,
    LogReadSource,
    LogSource,
    MiB,
    ModificationConflict,
    ModificationDisposition,
    ModificationPolicy,
    ModificationWarning,
    MountConfig,
    MountKind,
    NamedVolumeMode,
    Network,
    NetworkDestination,
    NetworkDestinationKind,
    NetworkPolicy,
    NetworkProfile,
    NetworkRateLimiter,
    Patch,
    PatchConfig,
    PatchKind,
    PlannedChange,
    PlannedChangeKind,
    PortBinding,
    PortProtocol,
    Protocol,
    PullEventType,
    PullPolicy,
    RateLimiter,
    RegistryAuth,
    ResourceConvergenceState,
    ResourceKind,
    ResourceResizeStatus,
    Rlimit,
    RlimitResource,
    RootDisk,
    RootDiskConfig,
    RootDiskKind,
    Rule,
    SandboxModificationPlan,
    SandboxStatus,
    ScopedUpstreamCACert,
    ScopedVerifyUpstream,
    Secret,
    SecretChangeKind,
    SecretEntry,
    SecretInjection,
    SecretModifySpec,
    SecretPlannedChange,
    SecurityProfile,
    Size,
    SnapshotFormat,
    SnapshotScope,
    SnapshotStateKind,
    StatVirtualization,
    Stdin,
    StdinMode,
    TlsConfig,
    TokenBucket,
    ViolationAction,
    ViolationPolicy,
    VolumeKind,
    VsockRoute,
    VsockSocketType,
)

# Pass the bundled msb path to Rust explicitly. `MSB_PATH` remains a user
# override and is still honored first by the native resolver.
if "MSB_PATH" not in _os.environ:
    _bundled_msb = _msb_path()
    if _bundled_msb.exists():
        _set_runtime_msb_path(str(_bundled_msb))

__all__ = [
    # Backend selection
    "BackendInfo",
    "default_backend_info",
    # Sandbox lifecycle (native)
    "Sandbox",
    "SandboxHandle",
    "SandboxPage",
    "SandboxStopResult",
    "SandboxPingResult",
    "SandboxTouchResult",
    "PullSession",
    "SandboxStatus",
    "ModificationPolicy",
    "SandboxModificationPlan",
    "ConfigPlannedChange",
    "SecretPlannedChange",
    "PlannedChange",
    "SecretModifySpec",
    "ModificationConflict",
    "ModificationWarning",
    "ResourceResizeStatus",
    "ChangeKind",
    "SecretChangeKind",
    "ModificationDisposition",
    "ResourceKind",
    "ResourceConvergenceState",
    "PlannedChangeKind",
    "SandboxSshOps",
    "SftpClient",
    "SshClient",
    "SshOutput",
    "SshServer",
    # Low-level agent client
    "AgentClient",
    "AgentStream",
    "FLAG_TERMINAL",
    "FLAG_SESSION_START",
    "FLAG_SHUTDOWN",
    # Execution (native)
    "ExecHandle",
    "ExecOptions",
    "ExecOutput",
    "ExecSink",
    "LogEntry",
    "LogStream",
    "MetricsStream",
    "ExitStatus",
    "Stdin",
    "StdinMode",
    "Rlimit",
    "RlimitResource",
    # Native execution and pull progress events
    "ExecEvent",
    "ExecEventType",
    "PullEvent",
    "PullEventType",
    # Filesystem (native)
    "SandboxFsOps",
    "FsReadStream",
    "FsWriteSink",
    "FsEntry",
    "FsMetadata",
    # Filesystem (Python enums)
    "FsEntryKind",
    # Volumes
    "Volume",
    "VolumeHandle",
    "MountConfig",
    "MountKind",
    "StatVirtualization",
    "HostPermissions",
    "VolumeKind",
    "NamedVolumeMode",
    # Snapshots
    "Snapshot",
    "SnapshotHandle",
    "SnapshotStateKind",
    "SnapshotFormat",
    "SnapshotScope",
    # Network
    "Network",
    "NetworkPolicy",
    "NetworkProfile",
    "NetworkRateLimiter",
    "Rule",
    "Destination",
    "NetworkDestination",
    "NetworkDestinationKind",
    "Action",
    "Direction",
    "Protocol",
    "PortBinding",
    "PortProtocol",
    "VsockRoute",
    "VsockSocketType",
    "DestGroup",
    "RateLimiter",
    "TokenBucket",
    # Secrets & TLS
    "Secret",
    "SecretEntry",
    "SecretInjection",
    "ScopedUpstreamCACert",
    "ScopedVerifyUpstream",
    "TlsConfig",
    "ViolationAction",
    "ViolationPolicy",
    # Images / rootfs
    "Image",
    "ImageHandle",
    "ImageDetail",
    "ImageConfigDetail",
    "ImageLayerDetail",
    "ImagePruneReport",
    "ImageSource",
    "ImageSourceKind",
    "ImageArchiveFormat",
    "RootDisk",
    "RootDiskConfig",
    "RootDiskKind",
    "DiskImageFormat",
    "FlatClone",
    "PullPolicy",
    "CpuPlacement",
    "RegistryAuth",
    "LogLevel",
    "DeploymentProfile",
    "SecurityProfile",
    "LogSource",
    "LogReadSource",
    # Patches
    "Patch",
    "PatchConfig",
    "PatchKind",
    # Init handoff
    "InitConfig",
    "InitOptions",
    # Metrics
    "SandboxMetrics",
    "all_sandbox_metrics",
    # Size helpers
    "Size",
    "MiB",
    "GiB",
    # Errors
    "MicrosandboxError",
    "InvalidConfigError",
    "NoDefaultCommandError",
    "CloudHttpError",
    "SandboxNotFoundError",
    "SandboxNotRunningError",
    "SandboxAlreadyExistsError",
    "SandboxStillRunningError",
    "ExecTimeoutError",
    "ExecFailedError",
    "FilesystemError",
    "PathNotFoundError",
    "VolumeNotFoundError",
    "ImageInUseError",
    "ImageNotFoundError",
    "ImagePullFailedError",
    "NetworkPolicyError",
    "SecretViolationError",
    "SnapshotMigrationError",
    "TlsError",
    "IoError",
    "MetricsDisabledError",
    "MetricsUnavailableError",
    "UnsupportedOperationError",
    "UnsupportedError",
    # Setup
    "install",
    "is_installed",
    "set_libkrunfw_path",
    "set_default_backend",
    "backend_scope",
    "default_backend_kind",
    "BackendKind",
    "version",
]
