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

namespace TeleWave.Infrastructure.Persistence.Configurations;

public class JunctionTemplateConfiguration : IEntityTypeConfiguration<JunctionTemplate>
{
    public void Configure(EntityTypeBuilder<JunctionTemplate> builder)
    {
        builder.Property(x => x.Name).IsRequired().HasMaxLength(128);
        builder.HasIndex(x => x.ChannelId);

        builder
            .HasMany(x => x.Elements)
            .WithOne()
            .HasForeignKey(e => e.JunctionTemplateId)
            .OnDelete(DeleteBehavior.Cascade);
        builder.Navigation(x => x.Elements).UsePropertyAccessMode(PropertyAccessMode.Field);
    }
}

public class JunctionElementConfiguration : IEntityTypeConfiguration<JunctionElement>
{
    public void Configure(EntityTypeBuilder<JunctionElement> builder)
    {
        builder.HasIndex(x => new { x.JunctionTemplateId, x.Position });
        builder.Property(x => x.ConditionsJson).HasColumnType("jsonb");

        // Группа не удаляется, пока на неё ссылается врезка: иначе стык молча перестал бы работать.
        builder
            .HasOne<Group>()
            .WithMany()
            .HasForeignKey(x => x.GroupId)
            .OnDelete(DeleteBehavior.Restrict);
    }
}
