use crate::domain::bookmark::Bookmark;
use crate::domain::error::DomainError;
use crate::domain::repositories::query::{BookmarkQuery, SortDirection};
use crate::domain::tag::Tag;
use crate::infrastructure::repositories::sqlite::connection::PooledConnection;
use crate::infrastructure::repositories::sqlite::error::{SqliteRepositoryError, SqliteResult};
use std::collections::HashSet;
pub trait BookmarkRepository: std::fmt::Debug + Send + Sync {
fn get_by_id(&self, id: i32) -> Result<Option<Bookmark>, DomainError>;
fn get_by_url(&self, url: &str) -> Result<Option<Bookmark>, DomainError>;
fn search(&self, query: &BookmarkQuery) -> Result<Vec<Bookmark>, DomainError>;
fn get_all(&self) -> Result<Vec<Bookmark>, DomainError>;
fn add(&self, bookmark: &mut Bookmark) -> Result<(), DomainError>;
fn update(&self, bookmark: &Bookmark) -> Result<(), DomainError>;
fn update_access(&self, bookmark: &Bookmark) -> Result<(), DomainError>;
fn delete(&self, id: i32) -> Result<bool, DomainError>;
fn get_all_tags(&self) -> Result<Vec<(Tag, usize)>, DomainError>;
fn get_related_tags(&self, tag: &Tag) -> Result<Vec<(Tag, usize)>, DomainError>;
fn get_random(&self, count: usize) -> Result<Vec<Bookmark>, DomainError>;
fn get_without_embeddings(&self) -> Result<Vec<Bookmark>, DomainError>;
fn get_by_all_tags(&self, tags: &HashSet<Tag>) -> Result<Vec<Bookmark>, DomainError>;
fn get_by_any_tag(&self, tags: &HashSet<Tag>) -> Result<Vec<Bookmark>, DomainError>;
fn get_by_access_date(
&self,
direction: SortDirection,
limit: Option<usize>,
) -> Result<Vec<Bookmark>, DomainError>;
fn search_by_text(&self, text: &str) -> Result<Vec<Bookmark>, DomainError>;
fn get_bookmarks(&self, query: &str) -> SqliteResult<Vec<Bookmark>>;
fn get_bookmarks_fts(&self, fts_query: &str) -> SqliteResult<Vec<i32>>;
fn exists_by_url(&self, url: &str) -> Result<i32, DomainError>;
fn get_embeddable_without_embeddings(&self) -> Result<Vec<Bookmark>, DomainError>;
fn get_bookmarks_by_ids(&self, ids: &[i32]) -> Result<Vec<Bookmark>, DomainError>;
fn get_all_bookmark_ids(
&self,
conn: &mut PooledConnection,
) -> Result<Vec<i32>, SqliteRepositoryError>;
}