using octo_fiesta.Models.Domain;
using octo_fiesta.Models.Settings;
using octo_fiesta.Models.Download;
using octo_fiesta.Models.Search;
using octo_fiesta.Models.Subsonic;
namespace octo_fiesta.Services;
///
/// Interface for the music download service (Deezspot or other)
///
public interface IDownloadService
{
///
/// Downloads a song from an external provider
///
/// The provider (deezer, spotify)
/// The ID on the external provider
/// Cancellation token
/// The path to the downloaded file
Task DownloadSongAsync(string externalProvider, string externalId, CancellationToken cancellationToken = default);
///
/// Downloads a song and streams the result progressively
///
/// The provider (deezer, spotify)
/// The ID on the external provider
/// Cancellation token
/// A stream of the audio file
Task DownloadAndStreamAsync(string externalProvider, string externalId, CancellationToken cancellationToken = default);
///
/// Downloads remaining tracks from an album in background (excluding the specified track)
///
/// The provider (deezer, spotify)
/// The album ID on the external provider
/// The track ID to exclude (already downloaded)
void DownloadRemainingAlbumTracksInBackground(string externalProvider, string albumExternalId, string excludeTrackExternalId);
///
/// Checks if a song is currently being downloaded
///
DownloadInfo? GetDownloadStatus(string songId);
///
/// Gets the local path for a song if it has been downloaded already
///
/// The provider (deezer, qobuz, etc.)
/// The ID on the external provider
/// The local file path if exists, null otherwise
Task GetLocalPathIfExistsAsync(string externalProvider, string externalId);
///
/// Checks if the service is properly configured and functional
///
Task IsAvailableAsync();
}