using Modules.Library.Domain.EntitiesV0.MediaContent.CommonProperties.ShadowEntities; using Modules.Library.Domain.EntitiesV0.MediaContent.Items.Anime; using Modules.Library.Domain.EntitiesV0.MediaContent.Items.Anime.ShadowEntities; namespace Modules.Library.Domain.EntityBuilders; public class AnimeTitleBuilder { private AnimeTitleShadow _title = new(new CommonPropertiesShadow()); private CommonPropertiesBuilder? _commonPropertiesBuilder; private List _seasonBuilders = []; private List _episodeBuilders = []; public AnimeTitleBuilder SetCommonProperties(CommonPropertiesBuilder builder) { _commonPropertiesBuilder = builder; return this; } public AnimeTitleBuilder AddEpisode(AnimeEpisodeBuilder builder) { _episodeBuilders.Add(builder); return this; } public AnimeTitleBuilder AddSeason(AnimeSeasonBuilder builder) { _seasonBuilders.Add(builder); return this; } public AnimeTitleBuilder SetCompleted(bool value) { _title.completed = value; return this; } public AnimeTitleBuilder SetDeleted(bool value) { _title.deleted = value; return this; } public AnimeTitleBuilder SetExpirationTime(TimeSpan value) { _title.expirationTime = value; return this; } public static AnimeTitleBuilder FromAnimeTitle(AnimeTitle title) { var builder = new AnimeTitleBuilder(); builder.SetCommonProperties(CommonPropertiesBuilder.FromCommonProperties(title.CommonProperties)); foreach (var item in title.Items) { if (item is AnimeSeason season) builder.AddSeason(AnimeSeasonBuilder.FromAnimeSeason(season)); else if (item is AnimeEpisode episode) builder.AddEpisode(AnimeEpisodeBuilder.FromAnimeEpisode(episode)); else throw new NotImplementedException(); } builder.SetCompleted(title.Completed); builder.SetDeleted(title.Deleted); builder.SetExpirationTime(title.ExpirationTime); return builder; } public AnimeTitle Build() { //_title.commonProperties = _commonPropertiesBuilder?.Build() ?? throw new Exception("No commonProperties"); if (_commonPropertiesBuilder != null) _title.commonProperties = _commonPropertiesBuilder.Build(); _title.items.AddRange(_seasonBuilders.Select(q => q.Build())); _title.items.AddRange(_episodeBuilders.Select(q => q.Build())); return new AnimeTitle(_title); } }