using SolutionErp.Domain.Common;

namespace SolutionErp.Domain.ContractSigningPlans;

// [W1 Mig 69 — S161] Dòng giá per-NCC-trúng-thầu của Kế hoạch ký kết.
// 1 row = 1 NCC (winner của PE nguồn). HĐ (GĐ3) sinh PER-NCC ⇒ dòng này là chỗ tự
// nhiên để giữ đường quay ngược Kế-hoạch → HĐ (`ContractId`, twin `PurchaseEvaluation.ContractId`).
//
// AuditableEntity (soft delete) — BẮT BUỘC vì UNIQUE (PlanId, SupplierId) phải là
// filtered `WHERE IsDeleted = 0` (gotcha #57: xoá mềm 1 NCC rồi thêm lại NCC đó
// sẽ đụng unique nếu index không filter).
public class ContractSigningPlanLine : AuditableEntity
{
    public Guid ContractSigningPlanId { get; set; }
    public Guid SupplierId { get; set; }            // loose-Guid (KHÔNG FK vật lý sang Suppliers)

    // [K2 Mig 71 — S164] Hạng mục danh mục SP-002 của dòng này (→ `ContractCatalogEntries.Id`).
    // 🔴 loose-Guid KHÔNG FK VẬT LÝ — mirror `PurchaseEvaluation.WorkItemId` (Mig 49) và
    // chính `SupplierId` ngay trên: convention module là mọi con trỏ ra ngoài module đều
    // loose. Thêm FK thật ở đây = phá khuôn + chặn soft-delete dòng danh mục.
    // NULL = dòng legacy (phiếu lập trước K2) hoặc dòng vừa auto-sinh chưa gán hạng mục.
    // Trình duyệt thì BẮT BUỘC có (submit-guard `ContractSigningPlanWorkflowService`).
    public Guid? CatalogEntryId { get; set; }

    // Denorm tên hạng mục TẠI THỜI ĐIỂM GÁN — danh mục đổi tên sau KHÔNG viết lại lịch sử
    // phiếu (khuôn `SignedByFullName` Mig 26). Đọc để hiển thị; đừng join ngược lấy tên mới.
    public string? TenHangMuc { get; set; }

    // [Mig 72 — S177] Denorm MÃ hạng mục ("A1-01"), chụp CÙNG LÚC với `TenHangMuc` ngay trên.
    // 🔴 Cặp mã+tên phải denorm CÙNG NHAU, không tách: denorm tên mà join ngược lấy mã thì
    // một dòng phiếu cũ sẽ hiện tên-lúc-ký ghép mã-hiện-tại — sai lệch khó thấy hơn cả việc
    // để trôi cả hai. Mọi write-site của `TenHangMuc` PHẢI ghi kèm field này.
    // NULL = dòng chưa gán hạng mục (`CatalogEntryId` cũng NULL). Dòng cũ trước Mig 72 đã được
    // backfill, KỂ CẢ khi hạng mục đó nay đã xoá mềm — backfill cố ý không lọc `IsDeleted`.
    // FE hiển thị lùi về tên khi thiếu mã, không để trống ô.
    public string? MaHangMuc { get; set; }

    // SNAPSHOT tổng báo giá của NCC này trên phiếu PE (SUM Quote.IsSelected) tại thời
    // điểm TẠO kế hoạch — chụp 1 lần, KHÔNG đọc live (PE sửa sau không được làm trôi
    // số của kế hoạch đã lập; cùng triết lý freeze ngân sách Mig 67).
    public decimal PeReferenceAmount { get; set; }

    public decimal ProposedAmount { get; set; }     // BCH đề xuất
    public decimal? ApprovedAmount { get; set; }    // CHỈ ghi tại choke-point finalize (W3)

    public Guid? ContractId { get; set; }           // [C6 review-schema] HĐ sinh ra từ dòng này (W5)
    public string? Note { get; set; }

    public ContractSigningPlan? ContractSigningPlan { get; set; }
}
