namespace WalletService.Domain.AggregatesModel.WalletAggregate;

using WalletService.Domain.SeedWork;

/// <summary>
/// EN: Repository interface for wallet aggregate
/// VI: Interface repository cho aggregate ví
/// </summary>
public interface IWalletRepository : IRepository<Wallet>
{
    /// <summary>
    /// EN: Get wallet by ID
    /// VI: Lấy ví theo ID
    /// </summary>
    Task<Wallet?> GetByIdAsync(Guid walletId);

    /// <summary>
    /// EN: Get wallet by user ID
    /// VI: Lấy ví theo ID người dùng
    /// </summary>
    Task<Wallet?> GetByUserIdAsync(Guid userId);

    /// <summary>
    /// EN: Get wallet by ID with transactions
    /// VI: Lấy ví theo ID kèm theo giao dịch
    /// </summary>
    Task<Wallet?> GetByIdWithTransactionsAsync(Guid walletId);

    /// <summary>
    /// EN: Get wallet transactions with pagination
    /// VI: Lấy giao dịch ví với phân trang
    /// </summary>
    Task<IEnumerable<WalletTransaction>> GetTransactionsAsync(
        Guid walletId, 
        int page = 1, 
        int pageSize = 20);

    /// <summary>
    /// EN: Count total transactions for a wallet
    /// VI: Đếm tổng số giao dịch của một ví
    /// </summary>
    Task<int> CountTransactionsAsync(Guid walletId);

    /// <summary>
    /// EN: Check if user already has a wallet
    /// VI: Kiểm tra xem người dùng đã có ví chưa
    /// </summary>
    Task<bool> ExistsByUserIdAsync(Guid userId);

    /// <summary>
    /// EN: Add a new wallet
    /// VI: Thêm ví mới
    /// </summary>
    Wallet Add(Wallet wallet);

    /// <summary>
    /// EN: Update an existing wallet
    /// VI: Cập nhật ví hiện có
    /// </summary>
    void Update(Wallet wallet);
}
