using SameBeat.Domain.Wyjatki;
namespace SameBeat.Domain.Encje;
///
/// Pojedyncze miejsce na scenie glownej -- jedno z 1..9 (zalezy od )
/// slotow, do ktorego host moze przypisac uczestnika oczekujacego. Wiersz jest tworzony przy
/// pierwszym przypisaniu numeru slotu i pozniej ponownie uzywany (Przypisz/Zwolnij), nie kasowany --
/// dzieki temu jeden numer slotu ma zawsze co najwyzej jeden wiersz w bazie na wydarzenie.
///
public class SlotSceny
{
public Guid Id { get; private set; }
public Guid WydarzenieId { get; private set; }
public int NumerSlotu { get; private set; }
///
/// Null = slot wolny. Nigdy nie jest ujawniany publicznie przez SignalR/REST widzom -- warstwa
/// aplikacji buduje z tego wylacznie (numerSlotu, nick), patrz komentarz przy SerwisSceny.
///
public Guid? UczestnikOczekujacyId { get; private set; }
// Prywatny konstruktor bez parametrow -- wymagany przez EF Core do materializacji encji z bazy.
private SlotSceny()
{
}
private SlotSceny(Guid id, Guid wydarzenieId, int numerSlotu)
{
Id = id;
WydarzenieId = wydarzenieId;
NumerSlotu = numerSlotu;
UczestnikOczekujacyId = null;
}
public static SlotSceny Utworz(Guid wydarzenieId, int numerSlotu)
{
if (wydarzenieId == Guid.Empty)
{
throw new NieprawidlowyStanEncjiWyjatek("Slot sceny musi byc powiazany z konkretnym wydarzeniem.");
}
if (numerSlotu < 1)
{
throw new NieprawidlowyStanEncjiWyjatek("Numer slotu musi byc dodatni.");
}
return new SlotSceny(Guid.NewGuid(), wydarzenieId, numerSlotu);
}
public void Przypisz(Guid uczestnikOczekujacyId)
{
if (uczestnikOczekujacyId == Guid.Empty)
{
throw new NieprawidlowyStanEncjiWyjatek("Nie mozna przypisac slotu do pustego identyfikatora uczestnika.");
}
UczestnikOczekujacyId = uczestnikOczekujacyId;
}
public void Zwolnij() => UczestnikOczekujacyId = null;
}