using SameBeat.Application.DTO;
namespace SameBeat.Application.Interfejsy;
///
/// Logika mikrofonu (ETAP 5) -- NAJWAZNIEJSZA funkcja produktu: host przyznaje uczestnikowi na scenie
/// mikrofon na dokladnie okreslony czas, a serwer (nie przegladarka) autorytatywnie ten czas
/// egzekwuje, patrz SerwisTimeraMikrofonu. Jeden aktywny mikrofon na raz w ramach wydarzenia -- host
/// musi najpierw przerwac poprzedni, zanim przyzna nowy (swiadome uproszczenie, patrz Wydarzenie).
///
public interface ISerwisMikrofonu
{
/// Biezacy stan mikrofonu -- do wyswietlenia w panelu hosta po odswiezeniu strony i do GET /api/events/current.
Task> PobierzStanAsync(CancellationToken token = default);
///
/// Przyznaje mikrofon uczestnikowi (musi miec Status=NaScenie) na czasSekundy. Odmawia, gdy ktos
/// inny ma juz aktywny mikrofon -- host musi go najpierw przerwac. Best-effort woła LiveKit, zeby
/// FIZYCZNIE dopisac "microphone" do canPublishSources aktywnego polaczenia uczestnika.
///
Task> PrzyznajAsync(Guid uczestnikId, int czasSekundy, string przyznalHostNick, CancellationToken token = default);
///
/// Reczne, natychmiastowe przerwanie przez hosta -- ta sama logika odbierania co przy wygasnieciu
/// timera. Idempotentne: gdy podany uczestnik akurat nie ma aktywnego mikrofonu (juz wygasl albo
/// nigdy go nie mial), to no-op zwracajacy biezacy stan, nie blad.
///
Task> PrzerwijAsync(Guid uczestnikId, CancellationToken token = default);
///
/// Wywolywane cyklicznie przez SerwisTimeraMikrofonu (co ok. 1 sekunde) -- sprawdza, czy aktywny
/// mikrofon biezacego wydarzenia wlasnie wygasl (AktywnyMikrofonKoniecUtc < teraz) i jesli tak,
/// odbiera go dokladnie tak samo jak PrzerwijAsync. Zwraca null, gdy nic sie nie zmienilo (nie ma
/// aktywnego mikrofonu albo jeszcze nie wygasl) -- wtedy caller nie ma czego rozglaszac przez SignalR.
///
Task SprawdzIOdbierzWygasleAsync(CancellationToken token = default);
}