namespace PlaylistShared.Pwa.Services;
///
/// Глобальный сервис управления аудиоплеером.
/// Позволяет управлять воспроизведением из любого компонента.
///
public interface IAudioPlayerService
{
#region Состояние плеера (для чтения)
/// ID текущего воспроизводимого трека (null, если ничего не играет).
string? CurrentTrackId { get; }
/// Играет ли в данный момент (true) или приостановлен (false).
bool IsPlaying { get; }
/// Текущая громкость (0–100).
double CurrentVolume { get; set; }
/// Прогресс воспроизведения в процентах (0–100).
double CurrentProgress { get; }
/// Отформатированное текущее время (мм:сс).
string CurrentTime { get; }
/// Отформатированная общая длительность (мм:сс).
string TotalTime { get; }
/// Отформатированное название текущего трека.
string? CurrentTrackTitle { get; }
/// URL обложки текущего трека.
string? CurrentTrackCoverUrl { get; }
#endregion
#region Команды управления (вызываются из компонентов)
/// Загрузить и начать воспроизведение трека.
/// ID трека.
/// Опциональный access-токен (если не указан, будет взят из хранилища).
/// ID расшаренного плейлиста (для неавторизованного доступа).
/// Название трека. (Если не передано, вызывает api для получения)
/// URL обложки трека. (Если не передано, вызывает api для получения)
Task LoadAndPlayAsync(string trackId, string? accessToken = null, string? sharedPlaylistId = null, string? title = null, string? coverUrl = null);
/// Воспроизвести (если трек загружен и на паузе).
Task PlayAsync();
/// Поставить на паузу.
Task PauseAsync();
/// Остановить воспроизведение и выгрузить трек.
Task StopAsync();
/// Перемотать на указанный процент (0–100).
Task SeekToAsync(double percent);
/// Установить громкость (0–100).
Task SetVolumeAsync(double volume);
#endregion
#region События для подписки на изменения состояния
///
/// Событие, возникающее при любом изменении состояния плеера:
/// смена трека, старт/пауза/стоп, обновление прогресса, изменение громкости, окончание трека.
/// Подписывайтесь на него, чтобы перерисовывать UI (например, иконку "пауза/плей").
///
event Action? OnStateChanged;
#endregion
#region События для связи с реальным компонентом AudioPlayer (Эти события вызываются сервисом)
/// Запрос на загрузку и воспроизведение трека.
event Func? OnLoadAndPlayRequested;
/// Запрос на воспроизведение (снять с паузы).
event Func? OnPlayRequested;
/// Запрос на паузу.
event Func? OnPauseRequested;
/// Запрос на остановку и выгрузку трека.
event Func? OnStopRequested;
/// Запрос на перемотку (процент 0–100).
event Func? OnSeekRequested;
/// Запрос на изменение громкости (0–100).
event Func? OnVolumeChangeRequested;
#endregion
#region Методы для обновления состояния из AudioPlayer (Вызываются компонентом AudioPlayer, когда реальный аудиоэлемент меняет своё состояние.)
/// Уведомить сервис о том, что трек начал или прекратил играть.
void SetPlayingState(bool isPlaying);
/// Установить ID текущего трека.
void SetCurrentTrack(string? trackId);
/// Обновить прогресс и отображаемое время.
void UpdateProgress(double progress, string currentTime, string totalTime);
/// Уведомить об окончании трека.
void NotifyTrackEnded();
#endregion
}