using SolutionErp.Domain.Common;
using SolutionErp.Domain.Contracts.Details;

namespace SolutionErp.Domain.Contracts;

// Aggregate root cho quy trình trình ký HĐ.
// State machine xem docs/workflow-contract.md — 9 phase + 1 TuChoi.
public class Contract : AuditableEntity
{
    public string? MaHopDong { get; set; }                         // Gen khi chuyển phase DangDongDau (RG-001)
    public ContractType Type { get; set; }
    public ContractPhase Phase { get; set; } = ContractPhase.DangSoanThao;
    public Guid SupplierId { get; set; }
    public Guid ProjectId { get; set; }
    public Guid? DepartmentId { get; set; }
    public Guid? DrafterUserId { get; set; }                       // Người soạn thảo
    public Guid? TemplateId { get; set; }                          // Template dùng để render
    public decimal GiaTri { get; set; }
    public string? TenHopDong { get; set; }
    public string? NoiDung { get; set; }
    public bool BypassProcurementAndCCM { get; set; }              // HĐ Chủ đầu tư → skip CCM
    public Guid? WorkflowDefinitionId { get; set; }                // Pinned at creation — HĐ cũ chạy version cũ ngay cả khi admin active version mới
    public Guid? ApprovalWorkflowId { get; set; }                  // [Plan B S29 2026-05-22 Mig 32] Pin schema mới ApprovalWorkflowsV2 — mirror PE Mig 23. V1+V2 coexist: 7 V1 contract giữ WorkflowDefinitionId; V2 mới pin ApprovalWorkflowId. Service ApproveV2Async branch theo field này.
    public DateTime? SlaDeadline { get; set; }                     // Hết hạn phase hiện tại
    public string? DraftData { get; set; }                         // JSON field values (render template)
    public bool SlaWarningSent { get; set; }                       // Flag để không gửi warning 2 lần

    // Manual budget fields (Phase 9 — Migration 17): user nhập tay tham chiếu
    // ngân sách. [S61 Mig 50] BudgetId (FK module Budget cũ) đã DROP cùng module —
    // 2 field manual GIỮ NGUYÊN (HĐ không đổi theo spec anh Kiệt S61).
    public string? BudgetManualName { get; set; }                  // Tên tham chiếu
    public decimal? BudgetManualAmount { get; set; }               // Tổng số tiền nhập tay (đ)

    // Smart reject (Phase 9 — Migration 16): Phase nguồn khi reject.
    public ContractPhase? RejectedFromPhase { get; set; }

    // Flat workflow tracking (Session 16 — Migration 21):
    // - CurrentWorkflowStepIndex: 0-based pointer step đang chờ approver
    // - RejectedAtStepIndex: snapshot khi Trả lại, restore khi resume
    public int? CurrentWorkflowStepIndex { get; set; }
    public int? RejectedAtStepIndex { get; set; }

    // [Plan B S29 2026-05-22 Mig 32] V2 workflow tracking — mirror PE Mig 24.
    // CurrentApprovalLevelOrder: Cấp đang chờ duyệt (1/2/3) trong Step hiện tại
    // khi pin ApprovalWorkflowId. Null khi V1 legacy hoặc V2 terminal (DaPhatHanh).
    public int? CurrentApprovalLevelOrder { get; set; }

    // [WQ3-BE S190 · YC-030 Q3 — Mig 73] Cờ RUNTIME "HĐ này ĐÃ kết thúc sớm bằng level-finalize"
    // (Cấp có `AllowApproverFinalize` bấm Duyệt ⇒ phát hành luôn, không trình tiếp các Bước/Cấp sau).
    // Mirror 1-1 `ContractSigningPlan.cs:51` (KHKK Mig 71) — cùng ngữ nghĩa, cùng lý do tồn tại:
    //
    // 🔴 VÌ SAO PHẢI LÀ CỘT chứ không suy từ config (bài #78, PE Mig 60): cây workflow là thứ
    //    admin sửa được BẤT KỲ LÚC NÀO, và người duyệt có quyền OPT-OUT (`applyLevelFinalize=false`
    //    ⇒ đi tiếp bình thường DÙ Cấp có cờ). Suy ngược từ `AllowApproverFinalize` của cây ⇒ HĐ
    //    opt-out vẫn bị gắn nhãn "kết thúc sớm", và HĐ kết thúc sớm THẬT sẽ mất nhãn ngay khi admin
    //    gỡ tick. Chỉ có cột ghi tại đúng thời điểm nhánh finalize chạy mới nói được sự thật.
    //
    // Write-site DUY NHẤT = nhánh finalize trong `ContractWorkflowService.ApproveV2Async`.
    // HĐ V1 legacy (`WorkflowDefinitionId`) KHÔNG dùng — luôn `false`.
    public bool EndedByLevelFinalize { get; set; }

    public List<ContractApproval> Approvals { get; set; } = new();
    public List<ContractComment> Comments { get; set; } = new();
    public List<ContractAttachment> Attachments { get; set; } = new();

    // Plan B Chunk C (S29 — Mig 33, 2026-05-22) — Ý kiến cấp duyệt V2 dynamic
    // cookie-cutter mirror PE Mig 26. UPSERT auto từ ApproveV2Async (Plan B
    // Chunk D em main wire). Section 5 FE render dynamic theo flow.steps[].levels[].
    // HĐ V1 (WorkflowDefinitionId) KHÔNG dùng.
    public List<ContractLevelOpinion> LevelOpinions { get; set; } = new();
    public List<ContractChangelog> Changelogs { get; set; } = new();
    public List<ContractDepartmentApproval> DepartmentApprovals { get; set; } = new();

    // Per-type details — chỉ 1 collection có data tương ứng với Type. Backend
    // logic dispatch theo Contract.Type để load đúng bảng. KHÔNG load eager
    // tất cả 7 — overhead. CQRS handler tự chọn DbSet theo Type.
    public List<ThauPhuDetail> ThauPhuDetails { get; set; } = new();
    public List<GiaoKhoanDetail> GiaoKhoanDetails { get; set; } = new();
    public List<NhaCungCapDetail> NhaCungCapDetails { get; set; } = new();
    public List<DichVuDetail> DichVuDetails { get; set; } = new();
    public List<MuaBanDetail> MuaBanDetails { get; set; } = new();
    public List<NguyenTacNccDetail> NguyenTacNccDetails { get; set; } = new();
    public List<NguyenTacDvDetail> NguyenTacDvDetails { get; set; } = new();
}
