using SameBeat.Domain.Wyjatki;
namespace SameBeat.Domain.Encje;
///
/// Pojedyncze wlaczenie transmisji live dla wydarzenia -- od momentu, gdy host wystartowal impreze,
/// do jej zakonczenia. Jedno wydarzenie moze miec wiele sesji w czasie (kolejne "live").
///
public class SesjaWydarzenia
{
public Guid Id { get; private set; }
public Guid WydarzenieId { get; private set; }
public Guid HostId { get; private set; }
public DateTime RozpoczetoUtc { get; private set; }
/// Null dopoki sesja trwa -- to normalny stan, nie brak danych.
public DateTime? ZakonczonoUtc { get; private set; }
public bool CzyTrwa => ZakonczonoUtc is null;
private SesjaWydarzenia()
{
}
private SesjaWydarzenia(Guid id, Guid wydarzenieId, Guid hostId, DateTime rozpoczetoUtc)
{
Id = id;
WydarzenieId = wydarzenieId;
HostId = hostId;
RozpoczetoUtc = rozpoczetoUtc;
}
public static SesjaWydarzenia Rozpocznij(Guid wydarzenieId, Guid hostId)
{
if (wydarzenieId == Guid.Empty)
{
throw new NieprawidlowyStanEncjiWyjatek("Sesja musi byc powiazana z konkretnym wydarzeniem.");
}
if (hostId == Guid.Empty)
{
throw new NieprawidlowyStanEncjiWyjatek("Sesja musi miec przypisanego hosta.");
}
return new SesjaWydarzenia(Guid.NewGuid(), wydarzenieId, hostId, DateTime.UtcNow);
}
public void Zakoncz()
{
if (ZakonczonoUtc is not null)
{
throw new NieprawidlowyStanEncjiWyjatek("Sesja jest juz zakonczona.");
}
ZakonczonoUtc = DateTime.UtcNow;
}
}