use std::collections::HashMap;
use std::path::{Path, PathBuf};
use std::sync::Arc;
use tokio::sync::Mutex;
use super::VisionSessionManager;
use crate::types::McpResult;
pub struct VisionTenantRegistry {
data_dir: PathBuf,
model_path: Option<String>,
sessions: HashMap<String, Arc<Mutex<VisionSessionManager>>>,
}
impl VisionTenantRegistry {
pub fn new(data_dir: &Path, model_path: Option<&str>) -> Self {
Self {
data_dir: data_dir.to_path_buf(),
model_path: model_path.map(|s| s.to_string()),
sessions: HashMap::new(),
}
}
pub fn get_or_create(&mut self, user_id: &str) -> McpResult<Arc<Mutex<VisionSessionManager>>> {
if let Some(session) = self.sessions.get(user_id) {
return Ok(session.clone());
}
std::fs::create_dir_all(&self.data_dir).map_err(|e| {
crate::types::McpError::InternalError(format!(
"Failed to create data dir {}: {e}",
self.data_dir.display()
))
})?;
let vision_path = self.data_dir.join(format!("{user_id}.avis"));
let path_str = vision_path.display().to_string();
tracing::info!("Opening vision store for user '{user_id}': {path_str}");
let session = VisionSessionManager::open(&path_str, self.model_path.as_deref())?;
let session = Arc::new(Mutex::new(session));
self.sessions.insert(user_id.to_string(), session.clone());
Ok(session)
}
pub fn count(&self) -> usize {
self.sessions.len()
}
}