use crate::core::{Buffer, Chunk, Context};
use crate::error::Result;
use serde::Serialize;
pub trait Storage {
fn init(&mut self) -> Result<()>;
fn is_initialized(&self) -> Result<bool>;
fn reset(&mut self) -> Result<()>;
fn save_context(&mut self, context: &Context) -> Result<()>;
fn load_context(&self) -> Result<Option<Context>>;
fn delete_context(&mut self) -> Result<()>;
fn add_buffer(&mut self, buffer: &Buffer) -> Result<i64>;
fn get_buffer(&self, id: i64) -> Result<Option<Buffer>>;
fn get_buffer_by_name(&self, name: &str) -> Result<Option<Buffer>>;
fn list_buffers(&self) -> Result<Vec<Buffer>>;
fn update_buffer(&mut self, buffer: &Buffer) -> Result<()>;
fn delete_buffer(&mut self, id: i64) -> Result<()>;
fn buffer_count(&self) -> Result<usize>;
fn add_chunks(&mut self, buffer_id: i64, chunks: &[Chunk]) -> Result<()>;
fn get_chunks(&self, buffer_id: i64) -> Result<Vec<Chunk>>;
fn get_chunk(&self, id: i64) -> Result<Option<Chunk>>;
fn delete_chunks(&mut self, buffer_id: i64) -> Result<()>;
fn chunk_count(&self, buffer_id: i64) -> Result<usize>;
fn export_buffers(&self) -> Result<String>;
fn stats(&self) -> Result<StorageStats>;
}
#[derive(Debug, Clone, Default, Serialize)]
pub struct StorageStats {
pub buffer_count: usize,
pub chunk_count: usize,
pub total_content_size: usize,
pub has_context: bool,
pub schema_version: u32,
pub db_size: Option<u64>,
}
#[cfg(feature = "usearch-hnsw")]
pub trait VectorStorage: Storage {
fn index_chunk(&mut self, chunk_id: i64, embedding: &[f32]) -> Result<()>;
fn search_similar(&self, query_embedding: &[f32], limit: usize) -> Result<Vec<(i64, f32)>>;
fn remove_index(&mut self, chunk_id: i64) -> Result<()>;
}