using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata;
using Microsoft.EntityFrameworkCore.Metadata.Builders;
using TeleWave.Domain.Library;

namespace TeleWave.Infrastructure.Persistence.Configurations;

public class CollectionConfiguration : IEntityTypeConfiguration<Collection>
{
    public void Configure(EntityTypeBuilder<Collection> builder)
    {
        builder.Property(x => x.Name).IsRequired().HasMaxLength(256);
        builder.Property(x => x.Description).HasMaxLength(2048);

        builder
            .HasMany(x => x.Items)
            .WithOne()
            .HasForeignKey(i => i.CollectionId)
            .OnDelete(DeleteBehavior.Cascade);
        builder.Navigation(x => x.Items).UsePropertyAccessMode(PropertyAccessMode.Field);
    }
}

public class CollectionItemConfiguration : IEntityTypeConfiguration<CollectionItem>
{
    public void Configure(EntityTypeBuilder<CollectionItem> builder)
    {
        builder.HasIndex(x => new { x.CollectionId, x.Position });
        // Шоу входит в коллекцию не более одного раза — иначе порядок воспроизведения неоднозначен.
        builder.HasIndex(x => new { x.CollectionId, x.ShowId }).IsUnique();
        builder.HasIndex(x => x.ShowId);

        // Удаление шоу из библиотеки убирает его и из коллекций: висячая позиция сломала бы
        // разворачивание коллекции в последовательность серий при генерации.
        builder
            .HasOne<Show>()
            .WithMany()
            .HasForeignKey(x => x.ShowId)
            .OnDelete(DeleteBehavior.Cascade);
    }
}
