using SameBeat.Application.DTO;
using SameBeat.Application.Komendy;
using SameBeat.Domain.Enumy;
namespace SameBeat.Application.Interfejsy;
///
/// Logika sceny glownej (ETAP 3) -- uklad, sloty i bezpieczne "wpuszczenie na scene" uczestnika z
/// poczekalni. Metody hosta (uklad/przypisanie/zwolnienie/podglad) dzialaja na biezacym wydarzeniu,
/// tak samo jak ISerwisPoczekalni. Metody uczestnika (status/token sceny) sa dostepne bez logowania
/// i zabezpieczone WYLACZNIE sekretem sesji (patrz OdpowiedzDolaczeniaDto) -- nigdy id samo w sobie.
///
public interface ISerwisSceny
{
/// Biezacy stan sceny (uklad + zajete sloty) do wyswietlenia w panelu hosta po odswiezeniu strony.
Task> PobierzStanScenyAsync(CancellationToken token = default);
///
/// Zmienia uklad sceny biezacego wydarzenia. Kazdy zajety slot o numerze wiekszym niz dopuszcza
/// nowy uklad zostaje zwolniony, a jego uczestnik wraca do statusu Oczekuje -- zero sierocych przypisan.
///
Task> ZmienUkladAsync(UkladSceny nowyUklad, CancellationToken token = default);
///
/// Przypisuje uczestnika (musi miec Status=Oczekuje) do slotu w granicach aktualnego ukladu.
/// Jesli slot byl zajety przez kogos innego, tamten wraca do poczekalni. Przypisanie tego samego
/// uczestnika do slotu, ktory juz zajmuje, jest no-op (sukces bez zmian).
///
Task> PrzypiszSlotAsync(int numerSlotu, Guid uczestnikId, CancellationToken token = default);
/// Zwalnia slot -- jego uczestnik (jesli byl) wraca do statusu Oczekuje. Idempotentne: pusty/nieistniejacy slot to tez sukces.
Task> ZwolnijSlotAsync(int numerSlotu, CancellationToken token = default);
///
/// Status uczestnika po weryfikacji sekretu sesji -- uzywane przez przegladarke uczestnika do
/// odpytywania, czy zostal wpuszczony na scene. Zly sekret / nieznany uczestnik to Niepowodzenie
/// (caller mapuje na 403, nigdy 500).
///
Task> PobierzStatusUczestnikaAsync(Guid uczestnikId, string sekret, CancellationToken token = default);
///
/// Wymienia sekret sesji na token LiveKit do pokoju GLOWNEGO -- tylko gdy sekret sie zgadza I
/// Status uczestnika to NaScenie. To jedyna droga, ktora wydaje prawo publikowania (kamera) na
/// scenie glownej -- patrz komentarz w SerwisTokenowLiveKit o rozdziale pokoju poczekalni/glownego.
///
Task> WydajTokenScenyAsync(TokenScenyKomenda komenda, CancellationToken token = default);
}