use crate::Result;
use async_trait::async_trait;
use indexmap::IndexSet;
use sos_backend::FolderEventLog;
use sos_core::{
device::{DevicePublicKey, TrustedDevice},
events::patch::FolderDiff,
AccountId, Paths, VaultFlags, VaultId,
};
use sos_sync::CreateSet;
use sos_vault::{Summary, Vault};
use std::collections::{HashMap, HashSet};
use std::sync::Arc;
use tokio::sync::RwLock;
#[async_trait]
pub trait ServerAccountStorage {
fn account_id(&self) -> &AccountId;
fn list_device_keys(&self) -> HashSet<&DevicePublicKey>;
fn paths(&self) -> Arc<Paths>;
fn folders(&self) -> &HashMap<VaultId, Arc<RwLock<FolderEventLog>>>;
fn folders_mut(
&mut self,
) -> &mut HashMap<VaultId, Arc<RwLock<FolderEventLog>>>;
fn set_devices(&mut self, devices: IndexSet<TrustedDevice>);
async fn rename_account(&self, name: &str) -> Result<()>;
async fn read_vault(&self, folder_id: &VaultId) -> Result<Vault>;
async fn write_vault(&self, vault: &Vault) -> Result<()>;
async fn write_login_vault(&self, vault: &Vault) -> Result<()>;
async fn replace_folder(
&self,
folder_id: &VaultId,
diff: &FolderDiff,
) -> Result<(FolderEventLog, Vault)>;
async fn set_folder_flags(
&self,
folder_id: &VaultId,
flags: VaultFlags,
) -> Result<()>;
async fn import_account(
&mut self,
account_data: &CreateSet,
) -> Result<()>;
async fn load_folders(&mut self) -> Result<Vec<Summary>>;
async fn import_folder(
&mut self,
id: &VaultId,
buffer: &[u8],
) -> Result<()>;
async fn rename_folder(&mut self, id: &VaultId, name: &str)
-> Result<()>;
async fn delete_folder(&mut self, id: &VaultId) -> Result<()>;
async fn delete_account(&mut self) -> Result<()>;
}