namespace TeleWave.Domain.Library;
///
/// Вариант написания жанра для сопоставления с внешними источниками. Хранит уже нормализованное
/// значение (см. ), поэтому поиск — это точное сравнение, без LIKE и без
/// приведения регистра на стороне БД.
///
/// Формы значения: числовой идентификатор провайдера (tmdb:28) либо имя жанра на любом языке
/// (action, боевик, sci-fi). Один жанр справочника собирает под собой сколько
/// угодно вариантов — так «Action» и «Action & Adventure» из TMDb сводятся к одному «Боевику».
///
public class GenreAlias
{
public Guid Id { get; private set; }
public Guid GenreId { get; private set; }
/// Нормализованное значение — уникально по всему справочнику.
public string Value { get; private set; } = string.Empty;
private GenreAlias() { }
internal static GenreAlias Create(Guid genreId, string value) =>
new()
{
Id = Guid.NewGuid(),
GenreId = genreId,
Value = Normalize(value),
};
/// Приводит написание к каноничному виду: нижний регистр, схлопнутые пробелы, без краёв.
public static string Normalize(string? value)
{
if (string.IsNullOrWhiteSpace(value))
return string.Empty;
var trimmed = value.Trim().ToLowerInvariant();
return string.Join(
' ',
trimmed.Split(' ', StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries)
);
}
/// Псевдоним по идентификатору жанра во внешнем источнике (tmdb:28).
public static string ProviderKey(string provider, string externalId) =>
Normalize($"{provider}:{externalId}");
}