using SameBeat.Domain.Wyjatki;
namespace SameBeat.Domain.Encje;
///
/// Utwor w bibliotece muzycznej hosta -- host dostarcza WLASNY, zgodny z prawem material (link do
/// pliku audio); backend nigdy nie hostuje ani nie sprawdza tresci pliku, tylko przechowuje jego URL
/// i metadane. Jeden Utwor moze byc dodany do playlisty wielu wydarzen (biblioteka jest globalna,
/// nie per-wydarzenie -- w odroznieniu od ).
///
public class Utwor
{
public const int MaksymalnaDlugoscTytulu = 200;
public const int MaksymalnaDlugoscWykonawcy = 200;
public const int MaksymalnaDlugoscUrl = 2048;
public Guid Id { get; private set; }
public string Tytul { get; private set; } = string.Empty;
public string? Wykonawca { get; private set; }
public string Url { get; private set; } = string.Empty;
/// Czas trwania w milisekundach -- dodawany RECZNIE przez hosta przy dodawaniu utworu (backend nie parsuje pliku audio).
public int CzasTrwaniaMs { get; private set; }
// Prywatny konstruktor bez parametrow -- wymagany przez EF Core do materializacji encji z bazy.
private Utwor()
{
}
private Utwor(Guid id, string tytul, string? wykonawca, string url, int czasTrwaniaMs)
{
Id = id;
Tytul = tytul;
Wykonawca = wykonawca;
Url = url;
CzasTrwaniaMs = czasTrwaniaMs;
}
///
/// Tworzy nowy utwor. Walidacja tutaj chroni przed powstaniem encji w niepoprawnym stanie
/// niezaleznie od tego, ktory serwis aplikacji jej uzyje -- to samo, co juz sprawdza
/// SerwisMuzyki przed wywolaniem tej metody (Uri.TryCreate itd.), jest tu powtorzone jako
/// druga linia obrony.
///
public static Utwor Utworz(string tytul, string? wykonawca, string url, int czasTrwaniaMs)
{
if (string.IsNullOrWhiteSpace(tytul))
{
throw new NieprawidlowyStanEncjiWyjatek("Tytul utworu nie moze byc pusty.");
}
var tytulPrzyciety = tytul.Trim();
if (tytulPrzyciety.Length > MaksymalnaDlugoscTytulu)
{
throw new NieprawidlowyStanEncjiWyjatek($"Tytul utworu moze miec maksymalnie {MaksymalnaDlugoscTytulu} znakow.");
}
var wykonawcaPrzyciety = string.IsNullOrWhiteSpace(wykonawca) ? null : wykonawca.Trim();
if (wykonawcaPrzyciety is not null && wykonawcaPrzyciety.Length > MaksymalnaDlugoscWykonawcy)
{
throw new NieprawidlowyStanEncjiWyjatek($"Wykonawca moze miec maksymalnie {MaksymalnaDlugoscWykonawcy} znakow.");
}
if (string.IsNullOrWhiteSpace(url) || url.Length > MaksymalnaDlugoscUrl || !Uri.TryCreate(url, UriKind.Absolute, out _))
{
throw new NieprawidlowyStanEncjiWyjatek("Url utworu musi byc poprawnym, pelnym adresem.");
}
if (czasTrwaniaMs <= 0)
{
throw new NieprawidlowyStanEncjiWyjatek("Czas trwania utworu musi byc dodatni.");
}
return new Utwor(Guid.NewGuid(), tytulPrzyciety, wykonawcaPrzyciety, url.Trim(), czasTrwaniaMs);
}
}