using SolutionErp.Domain.ApprovalWorkflowsV2;
using SolutionErp.Domain.Common;

namespace SolutionErp.Domain.ContractSigningPlans;

// [W1 Mig 69 — S161] Ý kiến cấp duyệt V2 cho Kế hoạch ký kết.
// Cookie-cutter mirror ContractLevelOpinion (Mig 33) / PurchaseEvaluationLevelOpinion (Mig 26)
// — twin thứ 8 của họ `*LevelOpinion`.
//
// Mỗi row = 1 (Plan × ApprovalWorkflowLevel). Service ApproveV2Async UPSERT sau khi
// duyệt xong Cấp hiện tại (latest-write-wins). Reject (TraLai/TuChoi) KHÔNG sync.
//
// UNIQUE composite (PlanId, LevelId) — 1 row/level/phiếu.
// FK Cascade Plan (xoá phiếu → wipe) + Restrict Level (admin xoá Level bị chặn khi
// còn chữ ký — bảo vệ data; 3 site liệt-kê-thủ-công trong ApprovalWorkflowV2AdminFeatures
// PHẢI biết bảng này, thiếu ⇒ admin xoá Level có chữ ký nổ FK 500).
//
// 🔴 CỐ Ý KHÔNG có HasQueryFilter (parity 7 twin còn lại): site "dọn chữ ký MỒ CÔI"
// (`ApprovalWorkflowV2AdminFeatures.cs` ExecuteDeleteAsync) phải THẤY được row đã
// soft-delete, nếu bị filter che thì row mồ côi sống sót và FK Restrict lại nổ 500.
public class ContractSigningPlanLevelOpinion : AuditableEntity
{
    public Guid ContractSigningPlanId { get; set; }
    public Guid ApprovalWorkflowLevelId { get; set; }

    public string? Comment { get; set; }                            // max 2000 hoặc placeholder
    public DateTime SignedAt { get; set; }
    public Guid SignedByUserId { get; set; }                        // người ký THẬT (có thể Admin duyệt thay)
    public string SignedByFullName { get; set; } = string.Empty;    // snapshot denorm (KHÔNG nav sang User)

    public ContractSigningPlan? ContractSigningPlan { get; set; }
    public ApprovalWorkflowLevel? Level { get; set; }
}
