namespace WalletService.Domain.Events;

using MediatR;

/// <summary>
/// EN: Domain event raised when currency exchange occurs in a wallet.
/// VI: Domain event được raise khi xảy ra quy đổi tiền tệ trong ví.
/// </summary>
public record WalletExchangedDomainEvent : INotification
{
    /// <summary>
    /// EN: Wallet ID.
    /// VI: ID ví.
    /// </summary>
    public Guid WalletId { get; init; }

    /// <summary>
    /// EN: User ID who owns the wallet.
    /// VI: ID người dùng sở hữu ví.
    /// </summary>
    public Guid UserId { get; init; }

    /// <summary>
    /// EN: Source currency type ID.
    /// VI: ID loại tiền tệ nguồn.
    /// </summary>
    public int FromCurrencyTypeId { get; init; }

    /// <summary>
    /// EN: Target currency type ID.
    /// VI: ID loại tiền tệ đích.
    /// </summary>
    public int ToCurrencyTypeId { get; init; }

    /// <summary>
    /// EN: Amount exchanged from source currency.
    /// VI: Số tiền quy đổi từ tiền tệ nguồn.
    /// </summary>
    public decimal FromAmount { get; init; }

    /// <summary>
    /// EN: Amount received in target currency.
    /// VI: Số tiền nhận được bằng tiền tệ đích.
    /// </summary>
    public decimal ToAmount { get; init; }

    /// <summary>
    /// EN: Exchange rate applied.
    /// VI: Tỷ giá áp dụng.
    /// </summary>
    public decimal ExchangeRate { get; init; }

    /// <summary>
    /// EN: Timestamp of the exchange.
    /// VI: Thời điểm quy đổi.
    /// </summary>
    public DateTime ExchangedAt { get; init; } = DateTime.UtcNow;

    public WalletExchangedDomainEvent(
        Guid walletId,
        Guid userId,
        int fromCurrencyTypeId,
        int toCurrencyTypeId,
        decimal fromAmount,
        decimal toAmount,
        decimal exchangeRate)
    {
        WalletId = walletId;
        UserId = userId;
        FromCurrencyTypeId = fromCurrencyTypeId;
        ToCurrencyTypeId = toCurrencyTypeId;
        FromAmount = fromAmount;
        ToAmount = toAmount;
        ExchangeRate = exchangeRate;
    }
}
