namespace WalletService.Domain.AggregatesModel.PointAccountAggregate;

using WalletService.Domain.SeedWork;

/// <summary>
/// EN: Point transaction entity representing a single point transaction
/// VI: Entity giao dịch điểm đại diện cho một giao dịch điểm đơn lẻ
/// </summary>
public class PointTransaction : Entity
{
    /// <summary>
    /// EN: The point account this transaction belongs to
    /// VI: Tài khoản điểm mà giao dịch này thuộc về
    /// </summary>
    public Guid AccountId { get; private set; }

    /// <summary>
    /// EN: Number of points in this transaction
    /// VI: Số điểm trong giao dịch này
    /// </summary>
    public long Points { get; private set; }

    /// <summary>
    /// EN: Type of point transaction
    /// VI: Loại giao dịch điểm
    /// </summary>
    public PointTransactionType Type { get; private set; } = null!;

    /// <summary>
    /// EN: Transaction type ID for EF Core
    /// VI: ID loại giao dịch cho EF Core
    /// </summary>
    public int TypeId { get; private set; }

    /// <summary>
    /// EN: Source of points (e.g., order ID, promotion code)
    /// VI: Nguồn điểm (ví dụ: ID đơn hàng, mã khuyến mãi)
    /// </summary>
    public string Source { get; private set; } = string.Empty;

    /// <summary>
    /// EN: Transaction description
    /// VI: Mô tả giao dịch
    /// </summary>
    public string Description { get; private set; } = string.Empty;

    /// <summary>
    /// EN: When the points expire (for earned points)
    /// VI: Thời điểm điểm hết hạn (cho điểm đã tích)
    /// </summary>
    public DateTime? ExpiresAt { get; private set; }

    /// <summary>
    /// EN: Balance after this transaction
    /// VI: Số dư sau giao dịch này
    /// </summary>
    public long BalanceAfter { get; private set; }

    /// <summary>
    /// EN: When the transaction was created
    /// VI: Thời điểm giao dịch được tạo
    /// </summary>
    public DateTime CreatedAt { get; private set; }

    protected PointTransaction() { }

    public PointTransaction(
        Guid accountId,
        long points,
        PointTransactionType type,
        long balanceAfter,
        string source,
        string description,
        DateTime? expiresAt = null)
    {
        Id = Guid.NewGuid();
        AccountId = accountId;
        Points = points;
        Type = type;
        TypeId = type.Id;
        BalanceAfter = balanceAfter;
        Source = source;
        Description = description;
        ExpiresAt = expiresAt;
        CreatedAt = DateTime.UtcNow;
    }
}
