using SolutionErp.Domain.Common;

namespace SolutionErp.Domain.Contracts;

// Audit log thống nhất cho mọi thay đổi liên quan HĐ — Header / Details /
// Workflow transition / Comment / Attachment. Khác `ContractApprovals` (chỉ
// log workflow transitions, dùng cho guard logic) — Changelog là VIEW LAYER
// cho user đọc lịch sử thao tác.
//
// 🔴 [S190 W5] ĐÍNH CHÍNH — câu cũ ở đây ghi "populate qua MediatR `AuditBehavior` interceptor
// (xem Application/Common/Behaviors/AuditBehavior.cs)". **File đó CHƯA BAO GIỜ tồn tại**
// (`Common/Behaviors/` chỉ có `ValidationBehavior.cs`); nó nằm ở mục "Tier 4+ còn thiếu" của
// skill `contract-workflow`. Câu cũ nguy hiểm hơn thiếu chú thích: người đọc tưởng nhật ký tự
// ghi rồi bỏ qua ⇒ thao tác mới lặng lẽ không để lại vết.
//
// SỰ THẬT: changelog ghi TAY, 2 đường:
//   (1) `Infrastructure/Services/ChangelogService.cs` (5 site — transition/comment/attachment…)
//   (2) `Add(new ContractChangelog{…})` thẳng trong handler — 3 site:
//       · `ContractSigningPlans/CreateContractFromSigningPlanFeatures.cs:247`  (Insert, bridge KHKK→HĐ)
//       · `PurchaseEvaluations/CreateContractFromEvaluationFeatures.cs:121`    (Insert, bridge PE→HĐ)
//       · `Contracts/ContractFeatures.cs` khối DELETE                          (Delete, S190 W5)
// Thêm thao tác mới mà muốn có vết thì phải TỰ ghi — không có ai ghi hộ.
public class ContractChangelog : BaseEntity
{
    public Guid ContractId { get; set; }
    public Contract? Contract { get; set; }

    public ChangelogEntityType EntityType { get; set; }   // Contract | Detail | Workflow | Comment | Attachment
    public Guid? EntityId { get; set; }                   // PK của child entity (null nếu là Contract header)
    public ChangelogAction Action { get; set; }           // Insert | Update | Delete | Transition
    public ContractPhase? PhaseAtChange { get; set; }     // Snapshot phase tại thời điểm change
    public Guid? UserId { get; set; }                     // Null = system (vd SLA auto-approve)
    public string? UserName { get; set; }                 // Denormalize cho log readable
    public string? Summary { get; set; }                  // Human-readable: "Đổi giá trị 100M → 150M"
    public string? FieldChangesJson { get; set; }         // JSON [{Field, OldValue, NewValue}] cho update
    public string? ContextNote { get; set; }              // Comment khi user kèm theo thay đổi
}

public enum ChangelogEntityType
{
    Contract = 1,
    Detail = 2,
    Workflow = 3,
    Comment = 4,
    Attachment = 5,
}

public enum ChangelogAction
{
    Insert = 1,
    Update = 2,
    Delete = 3,
    Transition = 4,                                       // Riêng cho workflow phase change
}
