using SameBeat.Application.DTO;
using SameBeat.Application.Komendy;
namespace SameBeat.Application.Interfejsy;
///
/// Logika czatu na zywo (ETAP 6) -- dostepnego dla kazdego widza, nie tylko uczestnikow na scenie.
/// Tozsamosc czatu (UczestnikCzatu) jest lekka i celowo osobna od poczekalni: bez sekretu sesji, bez
/// LiveKit, tworzona przy pierwszym wejsciu na czat.
///
public interface ISerwisCzatu
{
/// Tworzy nowa tozsamosc czatu dla biezacego wydarzenia.
Task> DolaczAsync(DolaczDoCzatuKomenda komenda, CancellationToken token = default);
///
/// Wysyla wiadomosc -- odmawia, gdy tozsamosc jest zbanowana, wyciszona, albo pisze za szybko
/// (rate limit liczony z ostatniej wiadomosci w bazie, nie ze stanu w pamieci procesu). Zwraca
/// wariant "hostowy" (z UczestnikCzatuId) -- to controller decyduje, ktora czesc rozglosic
/// publicznie (bez ID), a ktora tylko do grupy "host" (z ID), patrz WiadomoscCzatuHostaDto.
///
Task> WyslijWiadomoscAsync(WyslijWiadomoscKomenda komenda, CancellationToken token = default);
/// Ostatnie wiadomosci NIE usuniete dla biezacego wydarzenia -- do zaladowania historii przed pierwszymi zdarzeniami SignalR.
Task>> PobierzHistorieAsync(CancellationToken token = default);
/// Jak PobierzHistorieAsync, ale z UczestnikCzatuId nadawcy kazdej wiadomosci -- wylacznie dla hosta, potrzebne do moderacji (wycisz/odcisz/zbanuj).
Task>> PobierzHistorieDlaHostaAsync(CancellationToken token = default);
/// Soft-delete wiadomosci przez hosta.
Task UsunWiadomoscAsync(Guid wiadomoscId, CancellationToken token = default);
Task WyciszAsync(Guid uczestnikCzatuId, CancellationToken token = default);
Task OdciszAsync(Guid uczestnikCzatuId, CancellationToken token = default);
Task ZbanujAsync(Guid uczestnikCzatuId, CancellationToken token = default);
}