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

namespace SolutionErp.Infrastructure.Persistence.Configurations;

// [W1 Mig 69 — S161] Cookie-cutter mirror ContractLevelOpinionConfiguration.cs (Mig 33)
// — twin thứ 8 của họ `*LevelOpinion`.
//
// UNIQUE (PlanId, LevelId) = 1 row/level/phiếu; UPSERT (không soft-delete) ⇒ index
// KHÔNG filter, ĐÚNG như 7 twin còn lại (khác Lines: ở đó có xoá-mềm-rồi-thêm-lại thật).
// FK Cascade Plan + Restrict Level (bảo vệ chữ ký khi admin sửa quy trình).
// CỐ Ý KHÔNG HasQueryFilter — xem chú thích trong entity (site dọn chữ ký MỒ CÔI phải
// thấy được row soft-deleted, nếu không FK Restrict sẽ nổ 500 lúc admin xoá Cấp).
public class ContractSigningPlanLevelOpinionConfiguration
    : IEntityTypeConfiguration<ContractSigningPlanLevelOpinion>
{
    public void Configure(EntityTypeBuilder<ContractSigningPlanLevelOpinion> e)
    {
        e.ToTable("ContractSigningPlanLevelOpinions");
        e.HasKey(x => x.Id);

        e.Property(x => x.Comment).HasMaxLength(2000);
        e.Property(x => x.SignedByFullName).HasMaxLength(200).IsRequired();

        e.HasOne(x => x.ContractSigningPlan)
            .WithMany(p => p.LevelOpinions)
            .HasForeignKey(x => x.ContractSigningPlanId)
            .OnDelete(DeleteBehavior.Cascade);

        e.HasOne(x => x.Level)
            .WithMany()
            .HasForeignKey(x => x.ApprovalWorkflowLevelId)
            .OnDelete(DeleteBehavior.Restrict);

        e.HasIndex(x => new { x.ContractSigningPlanId, x.ApprovalWorkflowLevelId }).IsUnique();
        e.HasIndex(x => x.ApprovalWorkflowLevelId);
    }
}
