using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Builders;
using AdsBillingService.Domain.AggregatesModel.ChargeAggregate;

namespace AdsBillingService.Infrastructure.EntityConfigurations;

/// <summary>
/// EN: Entity configuration for AdCharge aggregate.
/// VI: Cấu hình entity cho aggregate AdCharge.
/// </summary>
public class AdChargeEntityTypeConfiguration : IEntityTypeConfiguration<AdCharge>
{
    public void Configure(EntityTypeBuilder<AdCharge> builder)
    {
        // EN: Table name / VI: Tên bảng
        builder.ToTable("ad_charges");

        // EN: Primary key / VI: Khóa chính
        builder.HasKey(c => c.Id);
        builder.Property(c => c.Id)
            .HasColumnName("id")
            .IsRequired();

        // EN: Advertiser ID / VI: ID Advertiser
        builder.Property(c => c.AdvertiserId)
            .HasColumnName("advertiser_id")
            .IsRequired();

        builder.HasIndex(c => c.AdvertiserId)
            .HasDatabaseName("ix_ad_charges_advertiser_id");

        // EN: Campaign ID / VI: ID chiến dịch
        builder.Property(c => c.CampaignId)
            .HasColumnName("campaign_id")
            .IsRequired();

        builder.HasIndex(c => c.CampaignId)
            .HasDatabaseName("ix_ad_charges_campaign_id");

        // EN: Ad ID / VI: ID quảng cáo
        builder.Property(c => c.AdId)
            .HasColumnName("ad_id")
            .IsRequired();

        // EN: Charge type / VI: Loại charge
        builder.Property(c => c.ChargeType)
            .HasColumnName("charge_type")
            .HasConversion<int>()
            .IsRequired();

        builder.HasIndex(c => c.ChargeType)
            .HasDatabaseName("ix_ad_charges_charge_type");

        // EN: Amount / VI: Số tiền
        builder.Property(c => c.Amount)
            .HasColumnName("amount")
            .HasColumnType("decimal(18,6)")
            .IsRequired();

        // EN: Currency / VI: Loại tiền
        builder.Property(c => c.Currency)
            .HasColumnName("currency")
            .HasMaxLength(10)
            .IsRequired();

        // EN: Charged at / VI: Thời điểm charge
        builder.Property(c => c.ChargedAt)
            .HasColumnName("charged_at")
            .IsRequired();

        builder.HasIndex(c => c.ChargedAt)
            .HasDatabaseName("ix_ad_charges_charged_at");

        // EN: Processed flag / VI: Cờ đã xử lý
        builder.Property(c => c.Processed)
            .HasColumnName("processed")
            .IsRequired();

        builder.HasIndex(c => c.Processed)
            .HasDatabaseName("ix_ad_charges_processed");

        // EN: Composite index for unprocessed charges / VI: Chỉ mục kết hợp cho charges chưa xử lý
        builder.HasIndex(c => new { c.AdvertiserId, c.Processed, c.ChargedAt })
            .HasDatabaseName("ix_ad_charges_advertiser_processed_charged");
    }
}
