using SameBeat.Application.DTO;
using SameBeat.Application.Komendy;
namespace SameBeat.Application.Interfejsy;
///
/// Logika muzyki (ETAP 4) -- biblioteka utworow, playlista biezacego wydarzenia i "zegar" odtwarzania.
/// Muzyka NIE idzie przez LiveKit/SignalR jako dzwiek -- kazdy klient sam odtwarza plik spod Utwor.Url
/// i synchronizuje swoja pozycje do CzasStartuUtc/PozycjaStartowaMs zwracanych w StanMuzykiDto (to jak
/// radio internetowe). Metody sterujace (Odtworz/Wstrzymaj/Nastepny/Poprzedni/UstawGlosnosc) dzialaja
/// na biezacym wydarzeniu, tak samo jak ISerwisSceny.
///
public interface ISerwisMuzyki
{
/// Dodaje utwor do globalnej biblioteki. Waliduje tytul/url/czasTrwaniaMs przez WynikOperacji, nie wyjatek.
Task> DodajUtworAsync(DodajUtworKomenda komenda, CancellationToken token = default);
/// Cala biblioteka utworow.
Task>> PobierzUtworyAsync(CancellationToken token = default);
/// Dodaje utwor na koniec kolejki biezacego wydarzenia. Zwraca cala kolejke po zmianie.
Task>> DodajDoPlaylistyAsync(Guid utworId, CancellationToken token = default);
/// Usuwa pozycje z kolejki. Zwraca cala kolejke po zmianie.
Task>> UsunZPlaylistyAsync(Guid pozycjaId, CancellationToken token = default);
/// Aktualna kolejka biezacego wydarzenia, uporzadkowana, z info ktora pozycja jest aktualnie grana.
Task>> PobierzPlaylisteAsync(CancellationToken token = default);
/// Biezacy stan zegara -- do wyswietlenia w panelu hosta po odswiezeniu strony i do GET /api/events/current.
Task> PobierzStanAsync(CancellationToken token = default);
///
/// UtworId podany -- przelacza na ten utwor od 0ms. UtworId brak i muzyka Wstrzymana -- wznawia
/// od zapisanej pozycji. UtworId brak i juz Odtwarzana -- no-op (sukces bez zmian).
///
Task> OdtworzAsync(Guid? utworId, CancellationToken token = default);
/// Wstrzymuje zegar na aktualnie przeliczonej pozycji. Idempotentne.
Task> WstrzymajAsync(CancellationToken token = default);
/// Nastepny utwor w kolejce (po Kolejnosc) od 0ms. Gdy to byl ostatni -- zatrzymuje (Zatrzymana, UtworId=null).
Task> NastepnyAsync(CancellationToken token = default);
/// Poprzedni utwor w kolejce od 0ms. Gdy to byl pierwszy -- zatrzymuje (Zatrzymana, UtworId=null).
Task> PoprzedniAsync(CancellationToken token = default);
/// Ustawia glosnosc master (0.0-1.0). Nie rusza stanu odtwarzania.
Task> UstawGlosnoscAsync(float wartosc, CancellationToken token = default);
}