Пагинация
=========

Все ресурсы (сделки, контакты, компании, задачи) поддерживают два режима
работы метода ``list()``.

Режимы работы ``list()``
------------------------

.. list-table::
   :header-rows: 1
   :widths: 40 30 30

   * - Вызов
     - Поведение
     - Тип возврата
   * - ``client.leads.list()``
     - Авто-пагинация: обходит все страницы
     - ``Iterator[Lead]``
   * - ``client.leads.list(page=2)``
     - Одна конкретная страница
     - ``list[Lead]``

Авто-пагинация (рекомендуется)
-------------------------------

Если ``page`` не передан, SDK автоматически запрашивает страницы одну за другой
и выдаёт элементы по мере загрузки (ленивый ``Iterator``). Цикл завершается,
когда API возвращает пустую страницу или страницу с числом элементов меньше ``limit``.

.. code-block:: python

   # Обойти все сделки
   for lead in client.leads.list():
       print(lead.id, lead.name)

   # Собрать всё в список
   all_leads = list(client.leads.list())

   # Кастомный размер страницы при авто-пагинации
   for contact in client.contacts.list(limit=100):
       process(contact)

   # С фильтром и сортировкой
   for task in client.tasks.list(
       filter={"responsible_user_id": 42},
       order={"created_at": "desc"},
   ):
       print(task.text)

По умолчанию авто-пагинация запрашивает **50 элементов** на страницу.

Одна страница
-------------

Передайте ``page`` явно — метод вернёт обычный ``list`` и сделает ровно один запрос:

.. code-block:: python

   leads = client.leads.list(page=1, limit=250)
   contacts = client.contacts.list(page=3, limit=50, query="Иван")

Это поведение аналогично предыдущим версиям SDK.

Сигнал конца данных
-------------------

SDK считает страницу последней в двух случаях:

1. API вернул пустой список (``_embedded.{entity} == []``).
2. Количество элементов на странице меньше ``limit`` (неполная страница).

Оба случая соответствуют поведению AmoCRM REST API (включая ответ 204,
который ``_request`` возвращает как ``{}``).
