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

namespace SolutionErp.Infrastructure.Persistence.Configurations;

// [W1 Mig 69 — S161 2026-07-29] Header "Kế hoạch ký kết HĐ" (GĐ2).
// Khuôn PurchaseEvaluationConfiguration.cs (HasQueryFilter :84 + FK Restrict workflow :70-73).
//
// loose-Guid KHÔNG FK vật lý: PurchaseEvaluationId / ProjectId / DepartmentId /
// DrafterUserId — chỉ HasIndex (convention PE + Mig 49).
public class ContractSigningPlanConfiguration : IEntityTypeConfiguration<ContractSigningPlan>
{
    public void Configure(EntityTypeBuilder<ContractSigningPlan> b)
    {
        b.ToTable("ContractSigningPlans");
        b.HasKey(x => x.Id);

        b.Property(x => x.MaKeHoach).HasMaxLength(50);          // "KHKK/2026/001"
        b.Property(x => x.Phase).HasConversion<int>();
        b.Property(x => x.HoSoLink).HasMaxLength(1000);
        b.Property(x => x.GhiChu).HasMaxLength(2000);

        // Mã phiếu UNIQUE khi đã gen — mirror PurchaseEvaluationConfiguration.cs:56 /
        // ProposalConfiguration.cs:23. 🔴 Đính chính comment W1 ("gen lúc Submit ⇒ nháp còn
        // null"): W2 gen NGAY LÚC TẠO ⇒ thực tế cột luôn NOT NULL. Filter GIỮ NGUYÊN (rộng
        // hơn mức cần, không sai) — đổi filter = migration mới, không đáng.
        b.HasIndex(x => x.MaKeHoach).IsUnique().HasFilter("[MaKeHoach] IS NOT NULL");

        b.HasIndex(x => x.PurchaseEvaluationId);

        // [K2 Mig 71 — S164] Rào "1 PE = 1 phiếu" đổi thành "(PE × NHÓM DUYỆT)" [OG-7] ⇒ 1 PE
        // được N phiếu miễn khác nhóm. 🔴 CỐ Ý **KHÔNG** dựng unique (PeId, ApprovalGroup) —
        // lý do THẬT (gate-K2 F-7 sửa; bản cũ "unique không diễn tả được Phase != TuChoi" SAI:
        // filtered index `WHERE [Phase] <> 3 AND [IsDeleted] = 0` diễn tả được). Đợt này chấp
        // nhận rào handler (check-then-insert, còn cửa race nhỏ) vì Phase mutable + UI-hướng-1;
        // chống race tuyệt đối = dựng filtered unique ở wave sau. Rào sống ở handler
        // (`ContractSigningPlanFeatures.cs` Region 1); index dưới đây chỉ để lọc/đếm theo nhóm
        // (list `?group=` + cây 8 folder) cho nhanh.
        b.HasIndex(x => new { x.ApprovalGroup, x.Phase });

        b.HasIndex(x => x.ProjectId);
        b.HasIndex(x => x.DepartmentId);
        b.HasIndex(x => x.DrafterUserId);
        b.HasIndex(x => new { x.Phase, x.IsDeleted });
        b.HasIndex(x => x.ApprovalWorkflowId);

        // FK Restrict sang bảng V2 dùng chung: KHÔNG cho xoá quy trình khi còn phiếu pin
        // (mirror PE `PurchaseEvaluationConfiguration.cs:70-73`).
        b.HasOne<SolutionErp.Domain.ApprovalWorkflowsV2.ApprovalWorkflow>()
            .WithMany()
            .HasForeignKey(x => x.ApprovalWorkflowId)
            .OnDelete(DeleteBehavior.Restrict);

        b.HasQueryFilter(x => !x.IsDeleted);
    }
}
