MyBookmark/Modules.Library.Domain/EntityBuilders/AnimeTitleBuilder.cs
2024-09-04 23:08:56 +03:00

75 lines
2.5 KiB
C#

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<AnimeSeasonBuilder> _seasonBuilders = [];
private List<AnimeEpisodeBuilder> _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);
}
}