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

namespace SolutionErp.Infrastructure.Persistence.Configurations;

// [W1 Mig 69 — S161] Lịch sử transition (1 row / lần chuyển phase).
// Khuôn PurchaseEvaluationApprovalConfiguration (`PurchaseEvaluationConfiguration.cs:156-170`)
// + index twin (PlanId, ApprovedAt).
//
// BaseEntity — append-only, KHÔNG soft-delete ⇒ KHÔNG HasQueryFilter (parity PE/Contract).
// `ApprovalWorkflowLevelId` = loose-Guid KHÔNG FK vật lý: FK Restrict ở đây sẽ làm admin xoá
// Level nổ 500 vì lịch sử duyệt, mà 3 site dọn dẹp trong ApprovalWorkflowV2AdminFeatures chỉ
// biết họ bảng *LevelOpinions (không biết *Approvals) — xem chú thích trong entity.
public class ContractSigningPlanApprovalConfiguration
    : IEntityTypeConfiguration<ContractSigningPlanApproval>
{
    public void Configure(EntityTypeBuilder<ContractSigningPlanApproval> b)
    {
        b.ToTable("ContractSigningPlanApprovals");
        b.HasKey(x => x.Id);

        b.Property(x => x.FromPhase).HasConversion<int>();
        b.Property(x => x.ToPhase).HasConversion<int>();
        b.Property(x => x.Decision).HasConversion<int>();
        b.Property(x => x.Comment).HasMaxLength(1000);

        b.HasIndex(x => new { x.ContractSigningPlanId, x.ApprovedAt });
        b.HasIndex(x => x.ApprovalWorkflowLevelId);

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