using Modules.Library.Domain.Entities; using Modules.Library.Domain.Entities.Genre; using Modules.Library.Domain.Entities.Language; using Modules.Library.Domain.Entities.MediaContent.CommonProperties; namespace Modules.Library.Domain.EntityBuilders; public class CommonPropertiesBuilder : ValueObjectBuilder { private static readonly Func CreateInstanceFunc = CreateInstanceFunction(); private static readonly Action SetInstanceFieldsAction = SetInstanceFieldsAction(); private readonly List _names = []; private MediaInfo? _preview = null; private readonly List _descriptions = []; private readonly List _genres = []; private readonly List _relatedContent = []; private DateTimeOffset? _announcementDate = null; private DateTimeOffset? _estimatedReleaseDate = null; private DateTimeOffset? _releaseDate = null; public CommonPropertiesBuilder AddName(Guid languageId, NameType type, string value) { _names.Add(new NameItem(languageId, type, value)); return this; } public CommonPropertiesBuilder SetPreview(string url, MediaInfoType type) { _preview = new MediaInfo(url, type); return this; } public CommonPropertiesBuilder AddDescription(Guid languageId, bool isOriginal, string value) { _descriptions.Add(new Description(languageId, isOriginal, value)); return this; } public CommonPropertiesBuilder AddGenreProportion(Genre genre, decimal? proportion) { _genres.Add(new GenreProportion(genre.Id, proportion)); return this; } public CommonPropertiesBuilder AddRelatedContent(string url, MediaInfoType type) { _relatedContent.Add(new MediaInfo(url, type)); return this; } public CommonPropertiesBuilder SetAnouncementDate(DateTimeOffset? value) { _announcementDate = value; return this; } public CommonPropertiesBuilder SetEstimatedReleaseDate(DateTimeOffset? value) { _estimatedReleaseDate = value; return this; } public CommonPropertiesBuilder SetReleaseDate(DateTimeOffset? value) { _releaseDate = value; return this; } internal static CommonPropertiesBuilder FromCommonProperties(CommonProperties item) { var builder = new CommonPropertiesBuilder(); foreach (var name in item.Names) { builder.AddName(name.LanguageId, name.Type, name.Value); } if (item.Preview != null) builder .SetPreview(item.Preview.Url, item.Preview.Type); foreach (var description in item.Descriptions) { builder.AddDescription(description.LanguageId, description.IsOriginal, description.Value); } //foreach (var genreProportion in item.Genres) { builder.AddGenreProportion(genreProportion.GenreId, genreProportion.Proportion); } foreach (var repatedContent in item.RelatedContent) { builder.AddRelatedContent(repatedContent.Url, repatedContent.Type); } builder.SetAnouncementDate(item.AnnouncementDate); builder.SetEstimatedReleaseDate(item.EstimatedReleaseDate); builder.SetReleaseDate(item.ReleaseDate); return builder; } public override CommonProperties Build() => throw new NotImplementedException(); internal CommonProperties BuildObject() { try { var result = CreateInstanceFunc(); SetInstanceFieldsAction(this, result); return result; } catch(Exception ex) { //throw; } throw new Exception(); } }