use async_trait::async_trait;
use chrono::NaiveDate;
use crate::chunk::{MemoryChunk, NewMemoryChunk};
use crate::error::Result;
use crate::ops::{
AgingReport, ExportBundle, ExportFilter, MemoryStats, PurgeReport, ReEmbedReport,
};
use crate::query::{MemoryPredicate, MemoryQuery};
use crate::session::{MemorySession, NewMemorySession, SessionFilter, SessionOutcome};
use crate::ops::EvictionReason;
#[async_trait]
pub trait MemoryProvider: Send + Sync {
async fn retrieve(&self, query: MemoryQuery) -> Result<Vec<MemoryChunk>>;
async fn get(&self, chunk_id: &str) -> Result<Option<MemoryChunk>>;
async fn get_session(&self, session_id: &str) -> Result<Option<MemorySession>>;
async fn list_sessions(&self, filter: SessionFilter) -> Result<Vec<MemorySession>>;
async fn write(&self, chunk: NewMemoryChunk) -> Result<MemoryChunk>;
async fn write_batch(&self, chunks: Vec<NewMemoryChunk>) -> Result<Vec<MemoryChunk>>;
async fn open_session(&self, init: NewMemorySession) -> Result<MemorySession>;
async fn close_session(&self, session_id: &str, outcome: SessionOutcome) -> Result<()>;
async fn rename_session(&self, session_id: &str, title: &str) -> Result<()>;
async fn pin(&self, chunk_id: &str, pinned: bool) -> Result<()>;
async fn update_importance(&self, chunk_id: &str, importance: f32) -> Result<()>;
async fn supersede(&self, old_id: &str, new_id: &str) -> Result<()>;
async fn record_access(&self, chunk_id: &str, retrieved_by: &str, used: bool) -> Result<()>;
async fn delete(&self, chunk_id: &str, reason: EvictionReason) -> Result<()>;
async fn delete_matching(
&self,
predicate: MemoryPredicate,
reason: EvictionReason,
) -> Result<usize>;
async fn purge_all(&self) -> Result<PurgeReport>;
async fn summarize_session(&self, session_id: &str) -> Result<MemoryChunk>;
async fn rollup_day(&self, date: NaiveDate) -> Result<Vec<MemoryChunk>>;
async fn rollup_day_forced(&self, date: NaiveDate) -> Result<Vec<MemoryChunk>> {
self.rollup_day(date).await
}
async fn rollup_rule_week(&self, rule_id: &str, week_start: NaiveDate) -> Result<MemoryChunk>;
async fn rollup_rule_week_forced(
&self,
rule_id: &str,
week_start: NaiveDate,
) -> Result<MemoryChunk> {
self.rollup_rule_week(rule_id, week_start).await
}
async fn run_aging_sweep(&self) -> Result<AgingReport>;
async fn re_embed_all(&self, target_model: &str) -> Result<ReEmbedReport>;
async fn export(&self, filter: ExportFilter) -> Result<ExportBundle>;
async fn stats(&self) -> Result<MemoryStats>;
}