# Pagination

The Wallhaven API paginates search results — by default you get 24 wallpapers per page. xanax gives you a few different ways to handle this.

## Auto-pagination with iter_media

The simplest option. This walks every page and yields wallpapers one at a time:

```python
from xanax import Wallhaven, SearchParams

client = Wallhaven(api_key="your-api-key")

for wallpaper in client.iter_media(SearchParams(query="space")):
    print(wallpaper.id, wallpaper.path)
```

Use this when you want to process individual wallpapers across all pages without thinking about pages at all.

## Auto-pagination with iter_pages

If you need page-level control — for example, to log progress or stop early — use `iter_pages()`:

```python
for page in client.iter_pages(SearchParams(query="anime")):
    print(f"Page {page.meta.current_page} of {page.meta.last_page}")
    for wallpaper in page.data:
        print(f"  {wallpaper.id}")
```

Each iteration yields a full `SearchResult`. The loop stops when the last page is reached.

## Manual pagination

For full control, call `search()` directly and manage pages yourself:

```python
params = SearchParams(query="nature")

# First page
result = client.search(params)

# Next page
if result.meta.current_page < result.meta.last_page:
    result = client.search(params.with_page(result.meta.current_page + 1))
```

## PaginationHelper

`PaginationHelper` provides a structured way to inspect and navigate pagination metadata:

```python
from xanax import Wallhaven, PaginationHelper, SearchParams

client = Wallhaven()
result = client.search(SearchParams(query="anime"))

helper = PaginationHelper(result.meta)

print(helper.current_page)   # 1
print(helper.last_page)      # e.g. 10
print(helper.total)          # e.g. 240
print(helper.has_next)       # True
print(helper.has_prev)       # False
print(helper.next_page_number())   # 2
print(helper.prev_page_number())   # None (on first page)

if helper.has_next:
    next_result = client.search(params.with_page(helper.next_page_number()))
```

## Random sort and seeds

When `sorting=Sort.RANDOM`, Wallhaven assigns a server-side seed that keeps the shuffle consistent across pages. The API returns this seed in `meta.seed`.

If you're paginating manually, carry the seed forward:

```python
from xanax.enums import Sort

params = SearchParams(sorting=Sort.RANDOM)
result = client.search(params)

if result.meta.seed:
    params = params.with_seed(result.meta.seed)
    page2 = client.search(params.with_page(2))
```

`iter_pages()` and `iter_media()` handle seed propagation automatically. You don't need to do anything.

## Async auto-pagination

`AsyncWallhaven` has async equivalents:

```python
import asyncio
from xanax import AsyncWallhaven, SearchParams

async def main():
    async with AsyncWallhaven(api_key="your-api-key") as client:
        # Flat wallpaper iteration
        async for wallpaper in client.aiter_media(SearchParams(query="space")):
            print(wallpaper.path)

        # Page-by-page
        async for page in client.aiter_pages(SearchParams(query="nature")):
            print(f"Page {page.meta.current_page}: {len(page.data)} wallpapers")

asyncio.run(main())
```

## Stopping early

Both sync and async generators support early exit cleanly:

```python
count = 0
for wallpaper in client.iter_media(SearchParams(query="anime")):
    print(wallpaper.id)
    count += 1
    if count >= 100:
        break
```
