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

namespace TeleWave.Infrastructure.Persistence.Configurations;

public class ChannelConfiguration : IEntityTypeConfiguration<Channel>
{
    public void Configure(EntityTypeBuilder<Channel> builder)
    {
        builder.Property(x => x.Name).IsRequired().HasMaxLength(256);
        builder.Property(x => x.Slug).IsRequired().HasMaxLength(128);
        builder.HasIndex(x => x.Slug).IsUnique();

        // Номер канала уникален среди заданных: переключение вверх-вниз по номерам иначе неоднозначно.
        builder.HasIndex(x => x.Number).IsUnique().HasFilter("\"Number\" IS NOT NULL");
    }
}

public class BumperTemplateConfiguration : IEntityTypeConfiguration<BumperTemplate>
{
    public void Configure(EntityTypeBuilder<BumperTemplate> builder)
    {
        builder.HasIndex(x => x.Name);
        builder.Property(x => x.Name).IsRequired().HasMaxLength(64);
        builder.Property(x => x.BackgroundColor).IsRequired().HasMaxLength(32);
        builder.Property(x => x.BackgroundColor2).IsRequired().HasMaxLength(32);
        builder.Property(x => x.AccentColor).IsRequired().HasMaxLength(32);
        builder.Property(x => x.TextColor).IsRequired().HasMaxLength(32);
        builder.Property(x => x.AudioExtension).HasMaxLength(16);

        builder
            .HasMany(x => x.Variants)
            .WithOne()
            .HasForeignKey(v => v.BumperTemplateId)
            .OnDelete(DeleteBehavior.Cascade);
        builder.Navigation(x => x.Variants).UsePropertyAccessMode(PropertyAccessMode.Field);
    }
}

public class BumperTextVariantConfiguration : IEntityTypeConfiguration<BumperTextVariant>
{
    public void Configure(EntityTypeBuilder<BumperTextVariant> builder)
    {
        builder.HasIndex(x => new { x.BumperTemplateId, x.Position });
        builder.Property(x => x.Name).IsRequired().HasMaxLength(64);
        builder.Property(x => x.Weight).HasDefaultValue(BumperTextVariant.DefaultWeight);

        // Строки — одной jsonb-колонкой: они всегда читаются и пишутся вместе с подблоком,
        // отдельная таблица дала бы join и порядковые правки там, где список заменяется целиком.
        builder.OwnsMany(
            x => x.Lines,
            lines =>
            {
                lines.ToJson();
                lines.Property(l => l.Text).HasMaxLength(120);
            }
        );
        builder.Navigation(x => x.Lines).UsePropertyAccessMode(PropertyAccessMode.Field);
    }
}
