using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Builders;
using MembershipService.Domain.AggregatesModel.MemberAggregate;

namespace MembershipService.Infrastructure.EntityConfigurations;

/// <summary>
/// EN: Entity configuration for Member aggregate.
/// VI: Cấu hình entity cho Member aggregate.
/// </summary>
public class MemberEntityTypeConfiguration : IEntityTypeConfiguration<Member>
{
    public void Configure(EntityTypeBuilder<Member> builder)
    {
        builder.ToTable("members");

        // EN: Primary key (same as UserId from IAM Service)
        // VI: Primary key (giống UserId từ IAM Service)
        builder.HasKey(m => m.Id);

        builder.Property(m => m.Id)
            .HasColumnName("id")
            .ValueGeneratedNever(); // EN: ID is set from IAM Service / VI: ID được set từ IAM Service

        // EN: Country code
        // VI: Mã quốc gia
        builder.Property("_countryCode")
            .HasColumnName("country_code")
            .HasMaxLength(2)
            .IsRequired();

        // EN: Gender
        // VI: Giới tính
        builder.Property("_gender")
            .HasColumnName("gender")
            .HasMaxLength(10);

        // EN: Current level
        // VI: Level hiện tại
        builder.Property("_currentLevel")
            .HasColumnName("current_level")
            .IsRequired()
            .HasDefaultValue(1);

        // EN: Current experience points
        // VI: Điểm kinh nghiệm hiện tại
        builder.Property("_currentExp")
            .HasColumnName("current_exp")
            .IsRequired()
            .HasDefaultValue(0);

        // EN: Total experience points ever earned
        // VI: Tổng điểm kinh nghiệm đã kiếm được
        builder.Property("_totalExpEarned")
            .HasColumnName("total_exp_earned")
            .IsRequired()
            .HasDefaultValue(0);

        // EN: Preferences (JSON)
        // VI: Preferences (JSON)
        builder.Property("_preferences")
            .HasColumnName("preferences")
            .HasColumnType("jsonb");

        // EN: Timestamps
        // VI: Timestamps
        builder.Property("_createdAt")
            .HasColumnName("created_at")
            .IsRequired();

        builder.Property("_updatedAt")
            .HasColumnName("updated_at")
            .IsRequired();

        // EN: Soft delete
        // VI: Xóa mềm
        builder.Property(m => m.IsDeleted)
            .HasField("_isDeleted")
            .HasColumnName("is_deleted")
            .HasDefaultValue(false);

        // EN: Query filter for soft delete
        // VI: Query filter cho xóa mềm
        builder.HasQueryFilter(m => !m.IsDeleted);

        // EN: Indexes
        // VI: Indexes
        builder.HasIndex("_createdAt")
            .HasDatabaseName("ix_members_created_at");

        builder.HasIndex("_currentLevel")
            .HasDatabaseName("ix_members_current_level");

        builder.HasIndex("_currentExp")
            .HasDatabaseName("ix_members_current_exp");

        builder.HasIndex(m => m.IsDeleted)
            .HasDatabaseName("ix_members_is_deleted");

        // EN: Ignore domain events (not persisted)
        // VI: Bỏ qua domain events (không lưu)
        builder.Ignore(m => m.DomainEvents);
    }
}
