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

namespace SolutionErp.Infrastructure.Persistence.Configurations;

// [W1 Mig 69 — S161] Dòng giá per-NCC.
// 🔴 UNIQUE (PlanId, SupplierId) PHẢI filtered `WHERE [IsDeleted] = 0` (gotcha #57 —
// 7× cumulative: Mig 43/45/47/64). Xoá mềm 1 NCC rồi thêm lại NCC đó = phải được.
public class ContractSigningPlanLineConfiguration : IEntityTypeConfiguration<ContractSigningPlanLine>
{
    public void Configure(EntityTypeBuilder<ContractSigningPlanLine> b)
    {
        b.ToTable("ContractSigningPlanLines");
        b.HasKey(x => x.Id);

        b.Property(x => x.PeReferenceAmount).HasPrecision(18, 2);
        b.Property(x => x.ProposedAmount).HasPrecision(18, 2);
        b.Property(x => x.ApprovedAmount).HasPrecision(18, 2);
        b.Property(x => x.Note).HasMaxLength(1000);
        // MaxLength khớp `ContractCatalogEntry.TenVi` (500, `ContractCatalogEntryConfiguration.cs`)
        // — denorm mà hẹp hơn nguồn thì tên dài nhất (A3-09 ~150 ký tự) vẫn lọt, nhưng để
        // BẰNG nguồn thì không bao giờ phải cắt. Validator lấy số từ ĐÂY (EF = source of truth).
        b.Property(x => x.TenHangMuc).HasMaxLength(500);
        // [Mig 72 — S177] Cùng lý lẽ BẰNG-NGUỒN như trên: `ContractCatalogEntry.Code` là 20
        // (`ContractCatalogEntryConfiguration.cs:18`) ⇒ denorm cũng 20, không bao giờ phải cắt.
        b.Property(x => x.MaHangMuc).HasMaxLength(20);

        // [K2 Mig 71 — S164] UNIQUE đổi (Plan, Supplier) → (Plan, Supplier, CatalogEntry):
        // 1 NCC được nhiều dòng trên cùng phiếu, mỗi dòng 1 hạng mục khác nhau.
        // 🔴 BẪY NULL-UNIQUE (vá-9): trong UNIQUE index SQL Server, NULL == NULL ⇒ HAI dòng
        // cùng (Plan, Supplier) mà đều `CatalogEntryId NULL` sẽ VI PHẠM index này. Dữ liệu cũ
        // an toàn (unique cũ bảo đảm ≤ 1 dòng/cặp ⇒ tối đa 1 NULL/cặp). Với dòng phát sinh
        // MỚI, mắt xích chặn KHÔNG PHẢI index này (index cũ đã bị DROP trong chính Mig 71)
        // mà là (gate-K2 F-2 — nói đúng THÌ): (1) SUBMIT-GUARD chặn null trước khi trình
        // (`ContractSigningPlanWorkflowService`) — lớp DUY NHẤT ĐANG TỒN TẠI; +
        // (2) [K4b — THÌ TƯƠNG LAI] validator đường gán hạng mục khi Lines-editor ra đời.
        // 🔴 CỐ Ý KHÔNG thêm `AND [CatalogEntryId] IS NOT NULL` vào filter: làm vậy là thả
        // trôi vô hạn dòng trùng (Plan, Supplier, NULL).
        b.HasIndex(x => new { x.ContractSigningPlanId, x.SupplierId, x.CatalogEntryId })
            .IsUnique()
            .HasFilter("[IsDeleted] = 0");
        b.HasIndex(x => x.SupplierId);
        b.HasIndex(x => x.CatalogEntryId);
        b.HasIndex(x => x.ContractId);

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

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