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 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
    public Guid? BudgetId { get; set; }                            // Reference Budget (Phase 7) — đối chiếu chi phí HĐ vs ngân sách

    // Manual budget fields (Phase 9 — Migration 17 mirror PE): user nhập tay khi
    // KHÔNG link Budget entity. Cả 2 cùng null OK. KHÔNG XOR validate với BudgetId.
    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. Drafter
    // sửa lại + trình lại → quay về RejectedFromPhase thay vì DangSoanThao
    // tuần tự lại từ đầu. Null khi chưa từng reject hoặc đã trình lại xong.
    public ContractPhase? RejectedFromPhase { get; set; }

    public List<ContractApproval> Approvals { get; set; } = new();
    public List<ContractComment> Comments { get; set; } = new();
    public List<ContractAttachment> Attachments { 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();
}
