using SolutionErp.Domain.Common;

namespace SolutionErp.Domain.Budgets;

// Aggregate root quản lý ngân sách. Gắn với Project (required), reference
// từ PurchaseEvaluation + Contract (cả 2 nullable FK Budget.Id).
//
// Workflow đơn giản 3-step: Drafter → CCM → CEO. Pattern hardcoded trong
// BudgetPolicy (chưa versioned, tương lai có thể thêm BudgetWorkflowDefinition
// nếu cần admin config).
public class Budget : AuditableEntity
{
    public string? MaNganSach { get; set; }                  // Auto-gen NS-YYYYMM-XXXX
    public string TenNganSach { get; set; } = string.Empty;
    public string? Description { get; set; }
    public int NamNganSach { get; set; }                     // Năm áp dụng (vd 2026)
    public Guid ProjectId { get; set; }                      // FK Projects (required)
    public Guid? DepartmentId { get; set; }
    public Guid? DrafterUserId { get; set; }

    public BudgetPhase Phase { get; set; } = BudgetPhase.DangSoanThao;
    public decimal TongNganSach { get; set; }                // Tổng = sum BudgetDetails.ThanhTien (computed)
    public DateTime? SlaDeadline { get; set; }
    public bool SlaWarningSent { get; set; }

    // 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.
    public BudgetPhase? RejectedFromPhase { get; set; }

    public List<BudgetDetail> Details { get; set; } = new();
    public List<BudgetApproval> Approvals { get; set; } = new();
    public List<BudgetChangelog> Changelogs { get; set; } = new();
    public List<BudgetDepartmentApproval> DepartmentApprovals { get; set; } = new();
}
