namespace WalletService.Domain.AggregatesModel.WalletAggregate;

using WalletService.Domain.SeedWork;

/// <summary>
/// EN: Wallet transaction entity representing a single transaction in a wallet
/// VI: Entity giao dịch ví đại diện cho một giao dịch đơn lẻ trong ví
/// </summary>
public class WalletTransaction : Entity
{
    /// <summary>
    /// EN: The wallet this transaction belongs to
    /// VI: Ví mà giao dịch này thuộc về
    /// </summary>
    public Guid WalletId { get; private set; }

    /// <summary>
    /// EN: Transaction amount
    /// VI: Số tiền giao dịch
    /// </summary>
    public Money Amount { get; private set; } = null!;

    /// <summary>
    /// EN: Type of transaction
    /// VI: Loại giao dịch
    /// </summary>
    public TransactionType 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: External reference ID (e.g., order ID, payment ID)
    /// VI: ID tham chiếu bên ngoài (ví dụ: ID đơn hàng, ID thanh toán)
    /// </summary>
    public string? ReferenceId { get; private set; }

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

    /// <summary>
    /// EN: Balance after this transaction
    /// VI: Số dư sau giao dịch này
    /// </summary>
    public decimal 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 WalletTransaction() { }

    public WalletTransaction(
        Guid walletId,
        Money amount,
        TransactionType type,
        decimal balanceAfter,
        string description,
        string? referenceId = null)
    {
        Id = Guid.NewGuid();
        WalletId = walletId;
        Amount = amount;
        Type = type;
        TypeId = type.Id;
        BalanceAfter = balanceAfter;
        Description = description;
        ReferenceId = referenceId;
        CreatedAt = DateTime.UtcNow;
    }
}
