using System; using System.Collections.Generic; using System.Linq.Expressions; using System.Runtime.InteropServices; using System.Threading.Tasks; using JetBrains.Annotations; using Kyoo.Models; namespace Kyoo.Controllers { public interface ILibraryManager : IDisposable, IAsyncDisposable { // Repositories ILibraryRepository LibraryRepository { get; } ILibraryItemRepository LibraryItemRepository { get; } ICollectionRepository CollectionRepository { get; } IShowRepository ShowRepository { get; } ISeasonRepository SeasonRepository { get; } IEpisodeRepository EpisodeRepository { get; } ITrackRepository TrackRepository { get; } IPeopleRepository PeopleRepository { get; } IStudioRepository StudioRepository { get; } IGenreRepository GenreRepository { get; } IProviderRepository ProviderRepository { get; } // Get by id Task GetLibrary(int id); Task GetCollection(int id); Task GetShow(int id); Task GetSeason(int id); Task GetSeason(int showID, int seasonNumber); Task GetEpisode(int id); Task GetEpisode(int showID, int seasonNumber, int episodeNumber); Task GetGenre(int id); Task GetStudio(int id); Task GetPeople(int id); // Get by slug Task GetLibrary(string slug); Task GetCollection(string slug); Task GetShow(string slug); Task GetSeason(string showSlug, int seasonNumber); Task GetEpisode(string showSlug, int seasonNumber, int episodeNumber); Task GetMovieEpisode(string movieSlug); Task GetTrack(int id); Task GetGenre(string slug); Task GetStudio(string slug); Task GetPeople(string slug); // Get by relations Task> GetSeasonsFromShow(int showID, Expression> where = null, Sort sort = default, Pagination limit = default); Task> GetSeasonsFromShow(int showID, [Optional] Expression> where, Expression> sort, Pagination limit = default ) => GetSeasonsFromShow(showID, where, new Sort(sort), limit); Task> GetSeasonsFromShow(string showSlug, Expression> where = null, Sort sort = default, Pagination limit = default); Task> GetSeasonsFromShow(string showSlug, [Optional] Expression> where, Expression> sort, Pagination limit = default ) => GetSeasonsFromShow(showSlug, where, new Sort(sort), limit); Task> GetEpisodesFromShow(int showID, Expression> where = null, Sort sort = default, Pagination limit = default); Task> GetEpisodesFromShow(int showID, [Optional] Expression> where, Expression> sort, Pagination limit = default ) => GetEpisodesFromShow(showID, where, new Sort(sort), limit); Task> GetEpisodesFromShow(string showSlug, Expression> where = null, Sort sort = default, Pagination limit = default); Task> GetEpisodesFromShow(string showSlug, [Optional] Expression> where, Expression> sort, Pagination limit = default ) => GetEpisodesFromShow(showSlug, where, new Sort(sort), limit); Task> GetEpisodesFromSeason(int seasonID, Expression> where = null, Sort sort = default, Pagination limit = default); Task> GetEpisodesFromSeason(int seasonID, [Optional] Expression> where, Expression> sort, Pagination limit = default ) => GetEpisodesFromSeason(seasonID, where, new Sort(sort), limit); Task> GetEpisodesFromSeason(int showID, int seasonNumber, Expression> where = null, Sort sort = default, Pagination limit = default); Task> GetEpisodesFromSeason(int showID, int seasonNumber, [Optional] Expression> where, Expression> sort, Pagination limit = default ) => GetEpisodesFromSeason(showID, seasonNumber, where, new Sort(sort), limit); Task> GetEpisodesFromSeason(string showSlug, int seasonNumber, Expression> where = null, Sort sort = default, Pagination limit = default); Task> GetEpisodesFromSeason(string showSlug, int seasonNumber, [Optional] Expression> where, Expression> sort, Pagination limit = default ) => GetEpisodesFromSeason(showSlug, seasonNumber, where, new Sort(sort), limit); Task> GetPeopleFromShow(int showID, Expression> where = null, Sort sort = default, Pagination limit = default); Task> GetPeopleFromShow(int showID, [Optional] Expression> where, Expression> sort, Pagination limit = default ) => GetPeopleFromShow(showID, where, new Sort(sort), limit); Task> GetPeopleFromShow(string showSlug, Expression> where = null, Sort sort = default, Pagination limit = default); Task> GetPeopleFromShow(string showSlug, [Optional] Expression> where, Expression> sort, Pagination limit = default ) => GetPeopleFromShow(showSlug, where, new Sort(sort), limit); Task> GetGenresFromShow(int showID, Expression> where = null, Sort sort = default, Pagination limit = default); Task> GetGenresFromShow(int showID, [Optional] Expression> where, Expression> sort, Pagination limit = default ) => GetGenresFromShow(showID, where, new Sort(sort), limit); Task> GetGenresFromShow(string showSlug, Expression> where = null, Sort sort = default, Pagination limit = default); Task> GetGenresFromShow(string showSlug, [Optional] Expression> where, Expression> sort, Pagination limit = default ) => GetGenresFromShow(showSlug, where, new Sort(sort), limit); Task> GetTracksFromEpisode(int episodeID, Expression> where = null, Sort sort = default, Pagination limit = default); Task> GetTracksFromEpisode(int episodeID, [Optional] Expression> where, Expression> sort, Pagination limit = default ) => GetTracksFromEpisode(episodeID, where, new Sort(sort), limit); Task> GetTracksFromEpisode(int showID, int seasonNumber, int episodeNumber, Expression> where = null, Sort sort = default, Pagination limit = default); Task> GetTracksFromEpisode(int showID, int seasonNumber, int episodeNumber, [Optional] Expression> where, Expression> sort, Pagination limit = default ) => GetTracksFromEpisode(showID, seasonNumber, episodeNumber, where, new Sort(sort), limit); Task> GetTracksFromEpisode(string showSlug, int seasonNumber, int episodeNumber, Expression> where = null, Sort sort = default, Pagination limit = default); Task> GetTracksFromEpisode(string showSlug, int seasonNumber, int episodeNumber, [Optional] Expression> where, Expression> sort, Pagination limit = default ) => GetTracksFromEpisode(showSlug, seasonNumber, episodeNumber, where, new Sort(sort), limit); Task GetStudioFromShow(int showID); Task GetStudioFromShow(string showSlug); Task GetShowFromSeason(int seasonID); Task GetShowFromEpisode(int episodeID); Task GetSeasonFromEpisode(int episodeID); Task> GetLibrariesFromShow(int showID, Expression> where = null, Sort sort = default, Pagination limit = default); Task> GetLibrariesFromShow(int showID, [Optional] Expression> where, Expression> sort, Pagination limit = default ) => GetLibrariesFromShow(showID, where, new Sort(sort), limit); Task> GetLibrariesFromShow(string showSlug, Expression> where = null, Sort sort = default, Pagination limit = default); Task> GetLibrariesFromShow(string showSlug, [Optional] Expression> where, Expression> sort, Pagination limit = default ) => GetLibrariesFromShow(showSlug, where, new Sort(sort), limit); Task> GetCollectionsFromShow(int showID, Expression> where = null, Sort sort = default, Pagination limit = default); Task> GetCollectionsFromShow(int showID, [Optional] Expression> where, Expression> sort, Pagination limit = default ) => GetCollectionsFromShow(showID, where, new Sort(sort), limit); Task> GetCollectionsFromShow(string showSlug, Expression> where = null, Sort sort = default, Pagination limit = default); Task> GetCollectionsFromShow(string showSlug, [Optional] Expression> where, Expression> sort, Pagination limit = default ) => GetCollectionsFromShow(showSlug, where, new Sort(sort), limit); Task> GetShowsFromLibrary(int id, Expression> where = null, Sort sort = default, Pagination limit = default); Task> GetShowsFromLibrary(int id, [Optional] Expression> where, Expression> sort, Pagination limit = default ) => GetShowsFromLibrary(id, where, new Sort(sort), limit); Task> GetShowsFromLibrary(string slug, Expression> where = null, Sort sort = default, Pagination limit = default); Task> GetShowsFromLibrary(string slug, [Optional] Expression> where, Expression> sort, Pagination limit = default ) => GetShowsFromLibrary(slug, where, new Sort(sort), limit); Task> GetCollectionsFromLibrary(int id, Expression> where = null, Sort sort = default, Pagination limit = default); Task> GetCollectionsFromLibrary(int id, [Optional] Expression> where, Expression> sort, Pagination limit = default ) => GetCollectionsFromLibrary(id, where, new Sort(sort), limit); Task> GetCollectionsFromLibrary(string showSlug, Expression> where = null, Sort sort = default, Pagination limit = default); Task> GetCollectionsFromLibrary(string showSlug, [Optional] Expression> where, Expression> sort, Pagination limit = default ) => GetCollectionsFromLibrary(showSlug, where, new Sort(sort), limit); Task> GetItemsFromLibrary(int id, Expression> where = null, Sort sort = default, Pagination limit = default); Task> GetItemsFromLibrary(int id, [Optional] Expression> where, Expression> sort, Pagination limit = default ) => GetItemsFromLibrary(id, where, new Sort(sort), limit); Task> GetItemsFromLibrary(string librarySlug, Expression> where = null, Sort sort = default, Pagination limit = default); Task> GetItemsFromLibrary(string librarySlug, [Optional] Expression> where, Expression> sort, Pagination limit = default ) => GetItemsFromLibrary(librarySlug, where, new Sort(sort), limit); Task> GetShowsFromCollection(int id, Expression> where = null, Sort sort = default, Pagination limit = default); Task> GetShowsFromCollection(int id, [Optional] Expression> where, Expression> sort, Pagination limit = default ) => GetShowsFromCollection(id, where, new Sort(sort), limit); Task> GetShowsFromCollection(string slug, Expression> where = null, Sort sort = default, Pagination limit = default); Task> GetShowsFromCollection(string slug, [Optional] Expression> where, Expression> sort, Pagination limit = default ) => GetShowsFromCollection(slug, where, new Sort(sort), limit); Task> GetLibrariesFromCollection(int id, Expression> where = null, Sort sort = default, Pagination limit = default); Task> GetLibrariesFromCollection(int id, [Optional] Expression> where, Expression> sort, Pagination limit = default ) => GetLibrariesFromCollection(id, where, new Sort(sort), limit); Task> GetLibrariesFromCollection(string slug, Expression> where = null, Sort sort = default, Pagination limit = default); Task> GetLibrariesFromCollection(string slug, [Optional] Expression> where, Expression> sort, Pagination limit = default ) => GetLibrariesFromCollection(slug, where, new Sort(sort), limit); Task> GetRolesFromPeople(int showID, Expression> where = null, Sort sort = default, Pagination limit = default); Task> GetRolesFromPeople(int showID, [Optional] Expression> where, Expression> sort, Pagination limit = default ) => GetRolesFromPeople(showID, where, new Sort(sort), limit); Task> GetRolesFromPeople(string showSlug, Expression> where = null, Sort sort = default, Pagination limit = default); Task> GetRolesFromPeople(string showSlug, [Optional] Expression> where, Expression> sort, Pagination limit = default ) => GetRolesFromPeople(showSlug, where, new Sort(sort), limit); // Helpers Task AddShowLink(int showID, int? libraryID, int? collectionID); Task AddShowLink([NotNull] Show show, Library library, Collection collection); // Get all Task> GetLibraries(Expression> where = null, Sort sort = default, Pagination limit = default); Task> GetCollections(Expression> where = null, Sort sort = default, Pagination limit = default); Task> GetShows(Expression> where = null, Sort sort = default, Pagination limit = default); Task> GetSeasonsFromShow(Expression> where = null, Sort sort = default, Pagination limit = default); Task> GetEpisodesFromShow(Expression> where = null, Sort sort = default, Pagination limit = default); Task> GetTracks(Expression> where = null, Sort sort = default, Pagination limit = default); Task> GetStudios(Expression> where = null, Sort sort = default, Pagination limit = default); Task> GetPeople(Expression> where = null, Sort sort = default, Pagination limit = default); Task> GetGenres(Expression> where = null, Sort sort = default, Pagination limit = default); Task> GetProviders(Expression> where = null, Sort sort = default, Pagination limit = default); Task> GetLibraries([Optional] Expression> where, Expression> sort, Pagination limit = default ) => GetLibraries(where, new Sort(sort), limit); Task> GetCollections([Optional] Expression> where, Expression> sort, Pagination limit = default ) => GetCollections(where, new Sort(sort), limit); Task> GetShows([Optional] Expression> where, Expression> sort, Pagination limit = default ) => GetShows(where, new Sort(sort), limit); Task> GetSeasonsFromShow([Optional] Expression> where, Expression> sort, Pagination limit = default ) => GetSeasonsFromShow(where, new Sort(sort), limit); Task> GetEpisodesFromShow([Optional] Expression> where, Expression> sort, Pagination limit = default ) => GetEpisodesFromShow(where, new Sort(sort), limit); Task> GetTracks([Optional] Expression> where, Expression> sort, Pagination limit = default ) => GetTracks(where, new Sort(sort), limit); Task> GetStudios([Optional] Expression> where, Expression> sort, Pagination limit = default ) => GetStudios(where, new Sort(sort), limit); Task> GetPeople([Optional] Expression> where, Expression> sort, Pagination limit = default ) => GetPeople(where, new Sort(sort), limit); Task> GetGenres([Optional] Expression> where, Expression> sort, Pagination limit = default ) => GetGenres(where, new Sort(sort), limit); Task> GetProviders([Optional] Expression> where, Expression> sort, Pagination limit = default ) => GetProviders(where, new Sort(sort), limit); // Search Task> SearchLibraries(string searchQuery); Task> SearchCollections(string searchQuery); Task> SearchShows(string searchQuery); Task> SearchSeasons(string searchQuery); Task> SearchEpisodes(string searchQuery); Task> SearchGenres(string searchQuery); Task> SearchStudios(string searchQuery); Task> SearchPeople(string searchQuery); //Register values Task RegisterLibrary(Library library); Task RegisterCollection(Collection collection); Task RegisterShow(Show show); Task RegisterSeason(Season season); Task RegisterEpisode(Episode episode); Task RegisterTrack(Track track); Task RegisterGenre(Genre genre); Task RegisterStudio(Studio studio); Task RegisterPeople(People people); // Edit values Task EditLibrary(Library library, bool resetOld); Task EditCollection(Collection collection, bool resetOld); Task EditShow(Show show, bool resetOld); Task EditSeason(Season season, bool resetOld); Task EditEpisode(Episode episode, bool resetOld); Task EditTrack(Track track, bool resetOld); Task EditGenre(Genre genre, bool resetOld); Task EditStudio(Studio studio, bool resetOld); Task EditPeople(People people, bool resetOld); // Delete values Task DelteLibrary(Library library); Task DeleteCollection(Collection collection); Task DeleteShow(Show show); Task DeleteSeason(Season season); Task DeleteEpisode(Episode episode); Task DeleteTrack(Track track); Task DeleteGenre(Genre genre); Task DeleteStudio(Studio studio); Task DeletePeople(People people); //Delete by slug Task DelteLibrary(string slug); Task DeleteCollection(string slug); Task DeleteShow(string slug); Task DeleteSeason(string slug); Task DeleteEpisode(string slug); Task DeleteTrack(string slug); Task DeleteGenre(string slug); Task DeleteStudio(string slug); Task DeletePeople(string slug); //Delete by id Task DelteLibrary(int id); Task DeleteCollection(int id); Task DeleteShow(int id); Task DeleteSeason(int id); Task DeleteEpisode(int id); Task DeleteTrack(int id); Task DeleteGenre(int id); Task DeleteStudio(int id); Task DeletePeople(int id); } }