using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata;
using Microsoft.EntityFrameworkCore.Metadata.Builders;
using TeleWave.Domain.Broadcast;
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.Name);

        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.Property(x => x.ChoiceKey).HasMaxLength(64);
        builder.Property(x => x.ChoiceWeight).HasDefaultValue(JunctionElement.DefaultChoiceWeight);

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

        // То же и с заставкой: блок общий, и удаление используемого выключило бы заставки в чужих
        // каналах. Проверку дублирует хендлер — ради внятной ошибки вместо нарушения ссылки.
        builder
            .HasOne<BumperTemplate>()
            .WithMany()
            .HasForeignKey(x => x.BumperTemplateId)
            .OnDelete(DeleteBehavior.Restrict);

        builder
            .HasOne<BumperTextVariant>()
            .WithMany()
            .HasForeignKey(x => x.BumperVariantId)
            .OnDelete(DeleteBehavior.Restrict);
    }
}
