using System;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
using Kavita.Common.Helpers;
using Kavita.Models.DTOs;
using Kavita.Models.DTOs.Dashboard;
using Kavita.Models.DTOs.Filtering;
using Kavita.Models.DTOs.Filtering.v2;
using Kavita.Models.DTOs.KavitaPlus.Metadata;
using Kavita.Models.DTOs.Scrobbling;
using Kavita.Models.DTOs.Search;
using Kavita.Models.DTOs.SeriesDetail;
using Kavita.Models.Entities;
using Kavita.Models.Entities.Enums;
using Kavita.Models.Entities.Metadata;
using Kavita.Models.Entities.User;
using Kavita.Models.Misc;
using Kavita.Models.Parser;
namespace Kavita.API.Repositories;
[Flags]
public enum SeriesIncludes
{
None = 1 << 0,
Volumes = 1 << 1,
///
/// This will include all necessary includes
///
Metadata = 1 << 2,
Related = 1 << 3,
Library = 1 << 4,
Chapters = 1 << 5,
ExternalReviews = 1 << 6,
ExternalRatings = 1 << 7,
ExternalRecommendations = 1 << 8,
ExternalMetadata = 1 << 9,
ExternalData = ExternalMetadata | ExternalReviews | ExternalRatings | ExternalRecommendations,
}
///
/// For complex queries, Library has certain restrictions where the library should not be included in results.
/// This enum dictates which field to use for the lookup.
///
public enum QueryContext
{
None = 1,
Search = 2,
[Obsolete("Use Dashboard")]
Recommended = 3,
Dashboard = 4,
}
public interface ISeriesRepository
{
void Add(Series series);
void Attach(SeriesRelation relation);
void Update(Series series);
void Update(SeriesMetadata seriesMetadata);
void Remove(Series series);
void Remove(IEnumerable series);
Task DoesSeriesNameExistInLibrary(string name, int libraryId, MangaFormat format, CancellationToken ct = default);
///
/// Adds user information like progress, ratings, etc
///
///
///
/// Pagination info
/// Filtering/Sorting to apply
///
///
Task> GetSeriesDtoForLibraryIdAsync(int libraryId, int userId, UserParams userParams, FilterDto filter, CancellationToken ct = default);
///
/// Does not add user information like progress, ratings, etc.
///
///
///
///
///
/// Includes Files in the Search
///
///
Task SearchSeries(int userId, bool isAdmin, IList libraryIds, string searchQuery, bool includeChapterAndFiles = true, CancellationToken ct = default);
Task> GetSeriesForLibraryIdAsync(int libraryId, SeriesIncludes includes = SeriesIncludes.None, CancellationToken ct = default);
Task GetSeriesDtoByIdAsync(int seriesId, int userId, CancellationToken ct = default);
Task GetSeriesByIdAsync(int seriesId, SeriesIncludes includes = SeriesIncludes.Volumes | SeriesIncludes.Metadata, CancellationToken ct = default);
Task> GetSeriesDtoByIdsAsync(IEnumerable seriesIds, AppUser user, CancellationToken ct = default);
Task> GetSeriesByIdsAsync(IList seriesIds, bool fullSeries = true, CancellationToken ct = default);
Task GetChapterIdsForSeriesAsync(IList seriesIds, CancellationToken ct = default);
Task>> GetChapterIdWithSeriesIdForSeriesAsync(int[] seriesIds, CancellationToken ct = default);
Task GetFilesizeForSeriesAsync(int seriesId, CancellationToken ct = default);
Task> GetFilesizeForMultipleSeriesAsync(IList seriesIds, CancellationToken ct = default);
Task GetSeriesCoverImageAsync(int seriesId, CancellationToken ct = default);
Task> GetOnDeck(int userId, int libraryId, UserParams userParams, FilterDto? filter, CancellationToken ct = default);
Task> GetRecentlyAdded(int libraryId, int userId, UserParams userParams, FilterDto filter, CancellationToken ct = default);
Task> GetRecentlyAddedV2(int userId, UserParams userParams, FilterV2Dto filter, CancellationToken ct = default);
Task GetSeriesMetadata(int seriesId, CancellationToken ct = default);
Task> GetSeriesDtoForCollectionAsync(int collectionId, int userId, UserParams userParams, CancellationToken ct = default);
Task> GetFilesForSeries(int seriesId, CancellationToken ct = default);
Task> GetSeriesDtoForIdsAsync(IEnumerable seriesIds, int userId, CancellationToken ct = default);
Task> GetAllCoverImagesAsync(CancellationToken ct = default);
Task> GetLockedCoverImagesAsync(CancellationToken ct = default);
Task> GetFullSeriesForLibraryIdAsync(int libraryId, UserParams userParams, CancellationToken ct = default);
Task GetFullSeriesForSeriesIdAsync(int seriesId, CancellationToken ct = default);
Task GetChunkInfo(int libraryId = 0, CancellationToken ct = default);
Task> GetRecentlyUpdatedSeries(int userId, UserParams? userParams, CancellationToken ct = default);
Task GetRelatedSeries(int userId, int seriesId, CancellationToken ct = default);
Task> GetSeriesForRelationKind(int userId, int seriesId, RelationKind kind, CancellationToken ct = default);
Task> GetQuickReads(int userId, int libraryId, UserParams userParams, CancellationToken ct = default);
Task> GetQuickCatchupReads(int userId, int libraryId, UserParams userParams, CancellationToken ct = default);
Task> GetHighlyRated(int userId, int libraryId, UserParams userParams, CancellationToken ct = default);
Task> GetMoreIn(int userId, int libraryId, int genreId, UserParams userParams, CancellationToken ct = default);
Task> GetRediscover(int userId, int libraryId, UserParams userParams, CancellationToken ct = default);
Task GetSeriesForMangaFile(int mangaFileId, int userId, CancellationToken ct = default);
Task GetSeriesForChapter(int chapterId, int userId, CancellationToken ct = default);
Task> GetWantToReadForUserAsync(int userId, UserParams userParams, FilterDto filter, CancellationToken ct = default);
Task> GetWantToReadForUserV2Async(int userId, UserParams userParams, FilterV2Dto filter, CancellationToken ct = default);
Task> GetWantToReadForUserAsync(int userId, CancellationToken ct = default);
Task IsSeriesInWantToRead(int userId, int seriesId, CancellationToken ct = default);
Task GetSeriesByFolderPath(string folder, SeriesIncludes includes = SeriesIncludes.None, CancellationToken ct = default);
Task GetSeriesThatContainsLowestFolderPath(string path, SeriesIncludes includes = SeriesIncludes.None, CancellationToken ct = default);
Task> GetAllSeriesByNameAsync(IList normalizedNames,
int userId, SeriesIncludes includes = SeriesIncludes.None, CancellationToken ct = default);
Task GetFullSeriesByAnyName(string seriesName, string localizedName, int libraryId, MangaFormat format, bool withFullIncludes = true, CancellationToken ct = default);
Task GetSeriesByAnyName(IList names, IList formats,
int userId, int? aniListId = null, SeriesIncludes includes = SeriesIncludes.None, CancellationToken ct = default);
Task GetSeriesByAnyName(string seriesName, string localizedName, IList formats, int userId, int? aniListId = null, SeriesIncludes includes = SeriesIncludes.None, CancellationToken ct = default);
public Task> GetAllSeriesByAnyName(string seriesName, string localizedName, int libraryId,
MangaFormat format, CancellationToken ct = default);
Task> RemoveSeriesNotInList(IList seenSeries, int libraryId, CancellationToken ct = default);
Task>> GetFolderPathMap(int libraryId, CancellationToken ct = default);
Task GetMaxAgeRatingFromSeriesAsync(IEnumerable seriesIds, CancellationToken ct = default);
Task> GetSeriesMetadataForIds(IEnumerable seriesIds, CancellationToken ct = default);
Task> GetAllWithCoversInDifferentEncoding(EncodeFormat encodeFormat, bool customOnly = true, CancellationToken ct = default);
Task GetSeriesDtoByNamesAndMetadataIds(IEnumerable names, LibraryType libraryType, string aniListUrl, string malUrl, CancellationToken ct = default);
Task GetAverageUserRating(int seriesId, int userId, CancellationToken ct = default);
Task RemoveFromOnDeck(int seriesId, int userId, CancellationToken ct = default);
Task ClearOnDeckRemoval(int seriesId, int userId, CancellationToken ct = default);
Task> GetSeriesDtoForLibraryIdV2Async(int userId, UserParams userParams, FilterV2Dto filterDto, QueryContext queryContext = QueryContext.None, CancellationToken ct = default);
Task GetPlusSeriesDto(int seriesId, CancellationToken ct = default);
Task MatchSeries(ExternalSeriesDetailDto externalSeries, CancellationToken ct = default);
}