using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Builders;

namespace CMSMicroservice.Infrastructure.Persistence.Configurations;

/// <summary>
/// عضویت باشگاه مشتریان
/// </summary>
public class ClubMembershipConfiguration : IEntityTypeConfiguration<ClubMembership>
{
    public void Configure(EntityTypeBuilder<ClubMembership> builder)
    {
        builder.HasQueryFilter(p => !p.IsDeleted);
        builder.Ignore(entity => entity.DomainEvents);
        
        builder.HasKey(entity => entity.Id);
        builder.Property(entity => entity.Id).UseIdentityColumn();
        
        builder.Property(entity => entity.UserId).IsRequired();
        builder.Property(entity => entity.IsActive).IsRequired();
        builder.Property(entity => entity.ActivatedAt).IsRequired(false);
        builder.Property(entity => entity.InitialContribution).IsRequired();
        builder.Property(entity => entity.GiftValue).IsRequired();
        builder.Property(entity => entity.TotalEarned).IsRequired();
        
        // فیلدهای جدید First/Last Activation
        builder.Property(entity => entity.FirstActivationDate).IsRequired(false);
        builder.Property(entity => entity.FirstPackageId).IsRequired(false);
        builder.Property(entity => entity.LastActivationDate).IsRequired(false);
        builder.Property(entity => entity.LastPackageId).IsRequired(false);
        
        // رابطه یک‌به‌یک با User
        builder.HasOne(entity => entity.User)
            .WithOne(u => u.ClubMembership)
            .HasForeignKey<ClubMembership>(entity => entity.UserId)
            .OnDelete(DeleteBehavior.Restrict);
        
        // رابطه با Package — اولین پکیج خریداری‌شده
        builder.HasOne(entity => entity.FirstPackage)
            .WithMany()
            .HasForeignKey(entity => entity.FirstPackageId)
            .IsRequired(false)
            .OnDelete(DeleteBehavior.Restrict);
        
        // رابطه با Package — آخرین پکیج خریداری‌شده
        builder.HasOne(entity => entity.LastPackage)
            .WithMany()
            .HasForeignKey(entity => entity.LastPackageId)
            .IsRequired(false)
            .OnDelete(DeleteBehavior.Restrict);
        
        // Index برای UserId (یونیک برای یک‌به‌یک)
        builder.HasIndex(e => e.UserId)
            .IsUnique()
            .HasDatabaseName("IX_ClubMembership_UserId");
        
        // Index برای IsActive
        builder.HasIndex(e => e.IsActive)
            .HasDatabaseName("IX_ClubMembership_IsActive");
        
        // Index برای LastActivationDate (تشخیص فعال‌سازی هفتگی Q22)
        builder.HasIndex(e => e.LastActivationDate)
            .HasDatabaseName("IX_ClubMembership_LastActivationDate");
    }
}
