using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Builders;
using AdsAnalyticsService.Domain.AggregatesModel.MetricsAggregate;

namespace AdsAnalyticsService.Infrastructure.EntityConfigurations;

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

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

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

        builder.HasIndex(m => m.CampaignId)
            .HasDatabaseName("idx_campaign_metrics_campaign_id");

        // EN: Date (for daily aggregation)
        // VI: Ngày (cho tổng hợp theo ngày)
        builder.Property(m => m.Date)
            .HasColumnName("date")
            .HasColumnType("date")
            .IsRequired();

        builder.HasIndex(m => new { m.CampaignId, m.Date })
            .IsUnique()
            .HasDatabaseName("idx_campaign_metrics_campaign_date");

        // EN: Performance metrics
        // VI: Chỉ số hiệu suất
        builder.Property(m => m.Impressions)
            .HasColumnName("impressions")
            .HasDefaultValue(0)
            .IsRequired();

        builder.Property(m => m.Clicks)
            .HasColumnName("clicks")
            .HasDefaultValue(0)
            .IsRequired();

        builder.Property(m => m.Conversions)
            .HasColumnName("conversions")
            .HasDefaultValue(0)
            .IsRequired();

        builder.Property(m => m.Spend)
            .HasColumnName("spend")
            .HasColumnType("decimal(18,2)")
            .HasDefaultValue(0m)
            .IsRequired();

        builder.Property(m => m.Revenue)
            .HasColumnName("revenue")
            .HasColumnType("decimal(18,2)")
            .HasDefaultValue(0m)
            .IsRequired();

        // EN: Ignore calculated properties
        // VI: Bỏ qua các thuộc tính được tính toán
        builder.Ignore(m => m.CTR);
        builder.Ignore(m => m.CPC);
        builder.Ignore(m => m.CPA);
        builder.Ignore(m => m.ROAS);

        // EN: Ignore domain events
        // VI: Bỏ qua domain events
        builder.Ignore(m => m.DomainEvents);
    }
}
