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; } 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 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 GetTrack(int episodeID, string language, bool isForced); Task GetGenre(string slug); Task GetStudio(string slug); Task GetPeople(string slug); // Get by relations Task> GetSeasons(int showID, Expression> where = null, Sort sort = default, Pagination limit = default); Task> GetSeasons(int showID, [Optional] Expression> where, Expression> sort, Pagination limit = default ) => GetSeasons(showID, where, new Sort(sort), limit); Task> GetSeasons(string showSlug, Expression> where = null, Sort sort = default, Pagination limit = default); Task> GetSeasons(string showSlug, [Optional] Expression> where, Expression> sort, Pagination limit = default ) => GetSeasons(showSlug, where, new Sort(sort), limit); Task> GetEpisodes(int showID, int seasonNumber); Task> GetEpisodes(string showSlug, int seasonNumber); Task> GetEpisodes(int seasonID); // 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> GetSeasons(Expression> where = null, Sort sort = default, Pagination limit = default); Task> GetEpisodes(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> GetSeasons([Optional] Expression> where, Expression> sort, Pagination limit = default ) => GetSeasons(where, new Sort(sort), limit); Task> GetEpisodes([Optional] Expression> where, Expression> sort, Pagination limit = default ) => GetEpisodes(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); } }