namespace WalletService.Domain.AggregatesModel.PointAccountAggregate;

using WalletService.Domain.SeedWork;

/// <summary>
/// EN: Repository interface for point account aggregate
/// VI: Interface repository cho aggregate tài khoản điểm
/// </summary>
public interface IPointAccountRepository : IRepository<PointAccount>
{
    /// <summary>
    /// EN: Get point account by ID
    /// VI: Lấy tài khoản điểm theo ID
    /// </summary>
    Task<PointAccount?> GetByIdAsync(Guid accountId);

    /// <summary>
    /// EN: Get point account by user ID
    /// VI: Lấy tài khoản điểm theo ID người dùng
    /// </summary>
    Task<PointAccount?> GetByUserIdAsync(Guid userId);

    /// <summary>
    /// EN: Get point account by ID with transactions
    /// VI: Lấy tài khoản điểm theo ID kèm theo giao dịch
    /// </summary>
    Task<PointAccount?> GetByIdWithTransactionsAsync(Guid accountId);

    /// <summary>
    /// EN: Get point transactions with pagination
    /// VI: Lấy giao dịch điểm với phân trang
    /// </summary>
    Task<IEnumerable<PointTransaction>> GetTransactionsAsync(
        Guid accountId,
        int page = 1,
        int pageSize = 20);

    /// <summary>
    /// EN: Count total transactions for a point account
    /// VI: Đếm tổng số giao dịch của một tài khoản điểm
    /// </summary>
    Task<int> CountTransactionsAsync(Guid accountId);

    /// <summary>
    /// EN: Check if user already has a point account
    /// VI: Kiểm tra xem người dùng đã có tài khoản điểm chưa
    /// </summary>
    Task<bool> ExistsByUserIdAsync(Guid userId);

    /// <summary>
    /// EN: Get accounts with expiring points
    /// VI: Lấy các tài khoản có điểm sắp hết hạn
    /// </summary>
    Task<IEnumerable<PointAccount>> GetAccountsWithExpiringPointsAsync(DateTime expiryDate);

    /// <summary>
    /// EN: Add a new point account
    /// VI: Thêm tài khoản điểm mới
    /// </summary>
    PointAccount Add(PointAccount account);

    /// <summary>
    /// EN: Update an existing point account
    /// VI: Cập nhật tài khoản điểm hiện có
    /// </summary>
    void Update(PointAccount account);
}
