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

namespace SolutionErp.Domain.Contracts;

// "Ý kiến cấp duyệt" V2 cho HĐ — sign-off DYNAMIC theo workflow ApprovalWorkflowV2
// (Mig 22-25 + Plan B Mig 32). Cookie-cutter mirror PE Mig 26
// `PurchaseEvaluationLevelOpinion` (S19 2026-05-09).
//
// Mỗi row = 1 (Contract × ApprovalWorkflowLevel). Service `ApproveV2Async` sau khi
// approve thành công Cấp hiện tại sẽ UPSERT row này (Plan B Chunk D em main wire):
//   Comment       = approval.Comment ?? "(duyệt — không ý kiến)"
//   SignedAt      = clock.UtcNow
//   SignedByUserId = actor.Id  (NV chính chủ HOẶC Admin override)
//   SignedByFullName = actor.FullName  (denorm — tránh user bị xóa/đổi tên)
//
// Reject (Trả lại / Từ chối) KHÔNG sync (vì không phải sign-off của level đó).
// Khi user resubmit từ TraLai → workflow chạy lại từ Cấp 1, opinion cũ bị
// OVERWRITE bằng UPSERT mới (latest-write-wins).
//
// Section 5 FE detect V2 qua `contract.approvalWorkflowId != null` → render dynamic
// theo flow.steps[].levels[]. HĐ V1 legacy (WorkflowDefinitionId set) → fallback
// không có ý kiến dynamic (giống PE V1 behavior).
public class ContractLevelOpinion : AuditableEntity
{
    public Guid ContractId { get; set; }
    public Guid ApprovalWorkflowLevelId { get; set; }

    public string? Comment { get; set; }                // ý kiến (max 2000) hoặc placeholder "(duyệt — không ý kiến)"
    public DateTime SignedAt { get; set; }              // luôn có khi UPSERT (Service set khi Approve)
    public Guid SignedByUserId { get; set; }            // người ký thực sự (có thể là Admin thay NV)
    public string SignedByFullName { get; set; } = string.Empty;  // snapshot tên — denorm

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