use std::io;
use thiserror::Error;
use uuid::Uuid;
pub type Result<T> = std::result::Result<T, PersistenceError>;
#[derive(Error, Debug)]
pub enum PersistenceError {
#[error("I/O error: {0}")]
Io(#[from] io::Error),
#[error("Bincode encoding error: {0}")]
BincodeEncode(#[from] bincode::error::EncodeError),
#[error("Bincode decoding error: {0}")]
BincodeDecode(#[from] bincode::error::DecodeError),
#[error("MessagePack serialization error: {0}")]
MessagePack(#[from] rmp_serde::encode::Error),
#[error("MessagePack deserialization error: {0}")]
MessagePackDecode(#[from] rmp_serde::decode::Error),
#[error("Compression error: {0}")]
Compression(String),
#[error("Session not found: {0}")]
SessionNotFound(Uuid),
#[error("Invalid file format: expected AGCX magic bytes")]
InvalidMagic,
#[error("Unsupported format version: {0} (expected {1})")]
UnsupportedVersion(u16, u16),
#[error("Corrupt session data: {0}")]
CorruptData(String),
#[error("Invalid format: {0}")]
InvalidFormat(String),
#[error("Incompatible version: expected {expected}, got {actual}")]
IncompatibleVersion { expected: u16, actual: u16 },
#[error("Storage path does not exist: {0}")]
PathNotFound(String),
#[error("Permission denied: {0}")]
PermissionDenied(String),
#[error("Session already exists: {0}")]
SessionAlreadyExists(Uuid),
#[error("Invalid checkpoint: {0}")]
InvalidCheckpoint(String),
#[error("Migration required from version {0} to {1}")]
MigrationRequired(u16, u16),
#[error("Migration failed: {0}")]
MigrationFailed(String),
#[error("Failed to acquire lock: {0}")]
LockFailed(String),
#[error("Memory mapping failed: {0}")]
MemoryMapFailed(String),
#[error("Session index corrupted: {0}")]
IndexCorrupted(String),
#[error("Auto-save failed: {0}")]
AutoSaveFailed(String),
#[error("JSON error: {0}")]
Json(#[from] serde_json::Error),
}