use std::{
fmt, mem,
sync::{
Arc,
atomic::{AtomicBool, AtomicU64, Ordering},
},
time::Duration,
};
use sha2::{Digest, Sha256};
use crate::{Db, DurabilityMode, Error, ObjectStoreReclamationEvidenceDigest, Result};
const CONTENT_ID_SHA256_TAG: u8 = 1;
const UPLOAD_TOKEN_VERSION: u8 = 1;
const CONTENT_LEASE_ID_VERSION: u8 = 1;
const CONTENT_ACCESS_BARRIER_ID_VERSION: u8 = 1;
const CONTENT_READER_DRAIN_ATTESTATION_ID_VERSION: u8 = 1;
const CONTENT_READER_DRAIN_EVIDENCE_SHA256_TAG: u8 = 1;
const CONTENT_RECLAIM_CLOCK_ATTESTATION_ID_VERSION: u8 = 1;
const CONTENT_RECLAIM_CLOCK_EVIDENCE_SHA256_TAG: u8 = 1;
const CONTENT_PHYSICAL_HOLD_ID_VERSION: u8 = 1;
const DESCRIPTOR_MAGIC: &[u8; 8] = b"TRNCNTD2";
const CHUNK_MAGIC: &[u8; 8] = b"TRNCNTC1";
const UPLOAD_STATE_MAGIC: &[u8; 8] = b"TRNUPLD5";
const UPLOAD_ID_TOMBSTONE_MAGIC: &[u8; 8] = b"TRNUPID1";
const UPLOAD_ID_TOMBSTONE_LEN: usize = 8 + 1 + 16;
const DESCRIPTOR_LEN: usize = 8 + 16 + 1 + 32 + 16 + 8 + 4 + 8;
const CHUNK_HEADER_LEN: usize = 8 + 16 + 8 + 4 + 32;
const UPLOAD_STATE_UPDATED_AT_OFFSET: usize =
8 + 1 + 16 + 8 + 4 + 8 + 8 + 4 + 1 + 8 + 1 + 33 + 16 + 16 + 32 + 8 + 8 + 1 + 33;
const UPLOAD_STATE_LEN: usize = UPLOAD_STATE_UPDATED_AT_OFFSET + 8;
const UPLOAD_STATE_OPEN: u8 = 0;
const UPLOAD_STATE_SEALING: u8 = 1;
const UPLOAD_STATE_SEALED: u8 = 2;
const UPLOAD_STATE_ABORTING: u8 = 3;
const MIN_CHUNK_BYTES: usize = 64 * 1024;
const MAX_CHUNK_BYTES: usize = 16 * 1024 * 1024;
pub(crate) const CONTENT_LEASE_BUCKET: &str = "\u{1}trine-content-lease\u{1}";
pub(crate) const CONTENT_LEASE_MAGIC: &[u8; 8] = b"TRNCNLS1";
pub(crate) const CONTENT_PHYSICAL_HOLD_BUCKET: &str = "\u{1}trine-content-physical-hold\u{1}";
const CONTENT_PHYSICAL_HOLD_MAGIC: &[u8; 8] = b"TRNCPHL1";
pub(crate) const CONTENT_CONTROL_BUCKET: &str = "\u{1}trine-content-control\u{1}";
pub(crate) const CONTENT_TOKEN_INDEX_BUCKET: &str = "\u{1}trine-content-token-index\u{1}";
const CONTENT_CONTROL_MAGIC: &[u8; 8] = b"TRNCRCL1";
const CONTENT_TOKEN_INDEX_MAGIC: &[u8; 8] = b"TRNCTIX1";
const CONTENT_CONTROL_ACTIVE: u8 = 0;
const CONTENT_CONTROL_RECLAIM_INTENT: u8 = 1;
const CONTENT_RECLAIM_PROOF_TOKEN_BYTES: usize = 49;
const CONTENT_ACCESS_BARRIER_MAGIC: &[u8; 8] = b"TRNCABR1";
const CONTENT_ACCESS_COORDINATE_MAGIC: &[u8; 8] = b"TRNCACO1";
const CONTENT_READER_DRAIN_ATTESTATION_MAGIC: &[u8; 8] = b"TRNCRDA1";
const CONTENT_READER_DRAIN_EVIDENCE_DOMAIN: &[u8] = b"trine-content-reader-drain-evidence-v1";
const CONTENT_QUARANTINE_MAGIC: &[u8; 8] = b"TRNCQRT1";
const CONTENT_RECLAIM_GRACE_MAGIC: &[u8; 8] = b"TRNCRGR1";
const CONTENT_RECLAIM_SWEEP_MAGIC: &[u8; 8] = b"TRNCRSW2";
const CONTENT_RECLAIM_CLOCK_EVIDENCE_DOMAIN: &[u8] = b"trine-content-reclaim-clock-evidence-v1";
const CONTENT_RECLAIM_SWEEP_PREPARED: u8 = 0;
const CONTENT_RECLAIM_SWEEP_RECLAIMED: u8 = 1;
pub(crate) const CONTENT_PHYSICAL_QUOTA_MAGIC: &[u8; 8] = b"TRNCPQO1";
pub(crate) const CONTENT_PHYSICAL_RESERVATION_MAGIC: &[u8; 8] = b"TRNCPQR1";
pub(crate) const CONTENT_PHYSICAL_ACCOUNT_MAGIC: &[u8; 8] = b"TRNCPQA1";
const CONTENT_PHYSICAL_QUOTA_KEY: u8 = b'Q';
const CONTENT_PHYSICAL_RESERVATION_KEY: u8 = b'U';
const CONTENT_PHYSICAL_ACCOUNT_KEY: u8 = b'A';
mod codec;
mod identity;
mod lease_hold;
mod reclaim;
mod transaction;
mod upload;
pub(crate) use codec::*;
pub use identity::*;
pub use lease_hold::*;
pub use reclaim::*;
pub use upload::*;
#[cfg(test)]
mod tests;