//! Replication types and protocols for distributed tidalDB deployments.
//!
//! The `replication` module is empty in single-node deployments --
//! all types default to `shard_id=0`, `region_id=0`, and routing is a no-op.

pub mod control;
pub mod crdt;
pub mod idempotency;
pub mod in_process;
pub mod lag;
pub mod migration;
pub mod receiver;
pub mod reconcile;
pub mod segment_id;
pub mod session_bridge;
pub mod shard;
pub mod shipper;
pub mod state;
pub mod tenant;
pub mod transport;
pub mod upgrade;

pub use control::{ClusterHealth, ControlPlane, RegionHealth, ShardStats};
pub use crdt::{Hlc, HlcTimestamp};
pub use idempotency::{IdempotencyKey, IdempotencyStore};
pub use in_process::{InProcessTransport, InProcessTransportFactory};
pub use lag::ReplicationLagGauge;
pub use migration::{MigrationState, TenantMigration};
pub use receiver::{SegmentReceiverHandle, spawn_receiver};
pub use reconcile::{HardNegAction, MergePlan, ReconciliationEngine, StateSnapshot};
pub use segment_id::WalSegmentId;
pub use session_bridge::{
    InProcessSessionTransportFactory, SessionBridgeError, SessionPayload, SessionReplicationBridge,
    SessionShardTransport,
};
pub use shard::{EntityIdRange, RegionId, RouterError, RoutingStrategy, ShardId, ShardRouter};
pub use shipper::{ShipperConfig, WalShipperHandle, spawn_shipper};
pub use state::ReplicationState;
pub use tenant::{
    ClusterTopology, ShardAssignment, TenantConfig, TenantId, TenantRateLimiter, TenantRouter,
};
pub use transport::{Transport, TransportError, WalSegmentPayload};
pub use upgrade::{RollingUpgradeCoordinator, UpgradePhase};

/// Current wall-clock time in nanoseconds since the Unix epoch.
///
/// Uses `u64`, which overflows in year 2554 — safe for all practical purposes.
#[allow(clippy::cast_possible_truncation)]
pub(crate) fn now_ns() -> u64 {
    std::time::SystemTime::now()
        .duration_since(std::time::UNIX_EPOCH)
        .unwrap_or_default()
        .as_nanos() as u64
}
