use crate::application::error::ApplicationResult;
use crate::domain::bookmark::Bookmark;
use crate::domain::repositories::query::{BookmarkQuery, SortDirection};
use crate::domain::search::{HybridSearch, HybridSearchResult, SemanticSearch, SemanticSearchResult};
use crate::domain::tag::Tag;
use std::collections::HashSet;
use std::fmt::Debug;
pub trait BookmarkService: Send + Sync + Debug {
fn add_bookmark(
&self,
url: &str,
title: Option<&str>,
description: Option<&str>,
tags: Option<&HashSet<Tag>>,
fetch_metadata: bool,
) -> ApplicationResult<Bookmark>;
fn delete_bookmark(&self, id: i32) -> ApplicationResult<bool>;
fn get_bookmark(&self, id: i32) -> ApplicationResult<Option<Bookmark>>;
fn set_bookmark_embeddable(&self, id: i32, embeddable: bool) -> ApplicationResult<Bookmark>;
fn update_bookmark(
&self,
bookmark: Bookmark,
force_embedding: bool,
) -> ApplicationResult<Bookmark>;
fn add_tags_to_bookmark(&self, id: i32, tags: &HashSet<Tag>) -> ApplicationResult<Bookmark>;
fn remove_tags_from_bookmark(
&self,
id: i32,
tags: &HashSet<Tag>,
) -> ApplicationResult<Bookmark>;
fn replace_bookmark_tags(&self, id: i32, tags: &HashSet<Tag>) -> ApplicationResult<Bookmark>;
fn search_bookmarks_by_text(&self, query: &str) -> ApplicationResult<Vec<Bookmark>>;
fn search_bookmarks(&self, query: &BookmarkQuery) -> ApplicationResult<Vec<Bookmark>>;
fn semantic_search(
&self,
search: &SemanticSearch,
) -> ApplicationResult<Vec<SemanticSearchResult>>;
fn hybrid_search(
&self,
search: &HybridSearch,
) -> ApplicationResult<Vec<HybridSearchResult>>;
fn get_bookmark_by_url(&self, url: &str) -> ApplicationResult<Option<Bookmark>>;
fn get_all_bookmarks(
&self,
sort_direction: Option<SortDirection>,
limit: Option<usize>,
) -> ApplicationResult<Vec<Bookmark>>;
fn get_random_bookmarks(&self, count: usize) -> ApplicationResult<Vec<Bookmark>>;
fn get_bookmarks_for_forced_backfill(&self) -> ApplicationResult<Vec<Bookmark>>;
fn get_bookmarks_without_embeddings(&self) -> ApplicationResult<Vec<Bookmark>>;
fn record_bookmark_access(&self, id: i32) -> ApplicationResult<Bookmark>;
fn load_json_bookmarks(&self, path: &str, dry_run: bool) -> ApplicationResult<usize>;
fn load_texts(&self, path: &str, dry_run: bool, force: bool) -> ApplicationResult<usize>;
fn import_files(
&self,
paths: &[String],
update: bool,
delete_missing: bool,
dry_run: bool,
verbose: bool,
base_path_name: Option<&str>,
) -> ApplicationResult<(usize, usize, usize)>; }