using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Builders;
using SolutionErp.Domain.ContractSigningPlans;

namespace SolutionErp.Infrastructure.Persistence.Configurations;

// [W1 Mig 69 — S161] Nhật ký thay đổi phiếu Kế hoạch ký kết — CÓ TỪ NGÀY 1
// (tiền lệ PE Mig 60/61: thiếu changelog thì không backfill lại được lịch sử).
//
// Khuôn PurchaseEvaluationChangelogConfiguration (`PurchaseEvaluationConfiguration.cs:172-190`),
// độ dài chuỗi theo spec §②-4: Summary 1000 (PE để 500) · ContextNote 2000 · UserName 200 ·
// FieldChangesJson nvarchar(max) (JSON tự do, KHÔNG index).
//
// BaseEntity — KHÔNG soft-delete ⇒ KHÔNG HasQueryFilter (append-only audit, parity PE/Contract).
// Index twin (PlanId, EntityType) = vế mà `LogTransitionAsync` copy sang cần để lọc theo phạm vi.
public class ContractSigningPlanChangelogConfiguration
    : IEntityTypeConfiguration<ContractSigningPlanChangelog>
{
    public void Configure(EntityTypeBuilder<ContractSigningPlanChangelog> b)
    {
        b.ToTable("ContractSigningPlanChangelogs");
        b.HasKey(x => x.Id);

        b.Property(x => x.EntityType).HasConversion<int>();
        b.Property(x => x.Action).HasConversion<int>();
        b.Property(x => x.PhaseAtChange).HasConversion<int>();
        b.Property(x => x.UserName).HasMaxLength(200);
        b.Property(x => x.Summary).HasMaxLength(1000);
        b.Property(x => x.ContextNote).HasMaxLength(2000);
        b.Property(x => x.FieldChangesJson).HasColumnType("nvarchar(max)");

        b.HasIndex(x => new { x.ContractSigningPlanId, x.CreatedAt });
        b.HasIndex(x => new { x.ContractSigningPlanId, x.EntityType });

        b.HasOne(x => x.ContractSigningPlan)
            .WithMany(p => p.Changelogs)
            .HasForeignKey(x => x.ContractSigningPlanId)
            .OnDelete(DeleteBehavior.Cascade);
    }
}
