using System.Collections.Concurrent;
using System.Text.RegularExpressions;
using Cleanuparr.Domain.Entities;
using Cleanuparr.Domain.Enums;
using Cleanuparr.Persistence.Models.Configuration;
using Cleanuparr.Persistence.Models.Configuration.DownloadCleaner;
namespace Cleanuparr.Infrastructure.Features.DownloadClient;
public interface IDownloadService : IDisposable
{
DownloadClientConfig ClientConfig { get; }
public Task LoginAsync();
///
/// Performs a health check on the download client
///
/// The health check result
public Task HealthCheckAsync();
///
/// Checks whether the download should be removed from the *arr queue.
///
/// The download hash.
/// Downloads to ignore from processing.
public Task ShouldRemoveFromArrQueueAsync(string hash,
IReadOnlyList ignoredDownloads);
///
/// Fetches all seeding downloads.
///
/// A list of downloads that are seeding.
Task?> GetSeedingDownloads();
///
/// Filters downloads that should be cleaned.
///
/// The downloads to filter.
/// The categories by which to filter the downloads.
/// A list of downloads for the provided categories.
List? FilterDownloadsToBeCleanedAsync(List? downloads, List categories);
///
/// Filters downloads that should have their category changed.
///
/// The downloads to filter.
/// The categories by which to filter the downloads.
/// A list of downloads for the provided categories.
List? FilterDownloadsToChangeCategoryAsync(List? downloads, List categories);
///
/// Cleans the downloads.
///
/// The downloads to clean.
/// The categories that should be cleaned.
/// The hashes that should not be cleaned.
/// The downloads to ignore from processing.
Task CleanDownloadsAsync(List? downloads, List categoriesToClean, HashSet excludedHashes, IReadOnlyList ignoredDownloads);
///
/// Changes the category for downloads that have no hardlinks.
///
/// The downloads to change.
/// The hashes that should not be cleaned.
/// The downloads to ignore from processing.
Task ChangeCategoryForNoHardLinksAsync(List? downloads, HashSet excludedHashes, IReadOnlyList ignoredDownloads);
///
/// Deletes a download item.
///
public Task DeleteDownload(string hash);
///
/// Creates a category.
///
/// The category name.
public Task CreateCategoryAsync(string name);
///
/// Blocks unwanted files from being fully downloaded.
///
/// The torrent hash.
/// Downloads to ignore from processing.
/// True if all files have been blocked; otherwise false.
public Task BlockUnwantedFilesAsync(string hash, IReadOnlyList ignoredDownloads);
}