using SolutionErp.Domain.Common;

namespace SolutionErp.Domain.PurchaseEvaluations;

// Aggregate root cho phiếu Duyệt NCC — module tiền-HĐ.
// Sau khi phê duyệt xong (Phase=DaDuyet) user click "Tạo HĐ từ phiếu" →
// kế thừa Details/Quotes sang Contract + ContractDetails.
public class PurchaseEvaluation : AuditableEntity
{
    public string? MaPhieu { get; set; }                            // Auto-gen khi create (format tính sau)
    public PurchaseEvaluationType Type { get; set; }
    public PurchaseEvaluationPhase Phase { get; set; } = PurchaseEvaluationPhase.DangSoanThao;

    public string TenGoiThau { get; set; } = string.Empty;          // "Cung cấp bê tông"
    public Guid ProjectId { get; set; }                              // Dự án (FK Projects)
    public Guid? DepartmentId { get; set; }
    public Guid? DrafterUserId { get; set; }                         // QS/NV.PB soạn
    public string? DiaDiem { get; set; }                             // Lô K, KCN Lộc An...
    public string? MoTa { get; set; }

    public Guid? WorkflowDefinitionId { get; set; }                  // Pinned at create — config y như HĐ
    public DateTime? SlaDeadline { get; set; }
    public bool SlaWarningSent { get; set; }

    public Guid? SelectedSupplierId { get; set; }                    // NCC thắng — null tới khi DaDuyet
    public string? PaymentTerms { get; set; }                        // JSON {tamUng, thanhToanTam, quyetToan, baoHanh, hanMucCongNo, danhGia}

    public Guid? ContractId { get; set; }                            // FK Contracts — set khi user gen HĐ từ phiếu
    public Guid? BudgetId { get; set; }                              // FK Budget (Phase 7) — đối chiếu báo giá vs ngân sách gói thầu

    // Manual budget fields (Phase 9 — Migration 17): user nhập tay khi KHÔNG link
    // Budget entity (vd ngân sách chưa approve hoặc gói nhỏ ko cần workflow ngân
    // sách riêng). Cả 2 cùng null OK (PE chưa có ngân sách gì cả). KHÔNG validate
    // XOR với BudgetId — tạm thời cho phép cả 2 cùng có (BE prefer BudgetId nếu
    // set vì có Phase=DaDuyet guarantee, manual chỉ là fallback hiển thị).
    public string? BudgetManualName { get; set; }                    // Tên tham chiếu vd "Tạm tính dự toán T11/2025"
    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ì đi tuần tự.
    public PurchaseEvaluationPhase? RejectedFromPhase { get; set; }

    public List<PurchaseEvaluationSupplier> Suppliers { get; set; } = new();
    public List<PurchaseEvaluationDetail> Details { get; set; } = new();
    public List<PurchaseEvaluationQuote> Quotes { get; set; } = new();
    public List<PurchaseEvaluationApproval> Approvals { get; set; } = new();
    public List<PurchaseEvaluationChangelog> Changelogs { get; set; } = new();
    public List<PurchaseEvaluationAttachment> Attachments { get; set; } = new();
    public List<PurchaseEvaluationDepartmentOpinion> DepartmentOpinions { get; set; } = new();
    public List<PurchaseEvaluationDepartmentApproval> DepartmentApprovals { get; set; } = new();
}
