"""
El lote informa avance mientras trabaja, no sólo al cerrar (T075).

La pantalla consulta el estado cada cinco segundos y dibuja la barra con las
cifras del lote. Si `processed_items` se escribiera recién al cerrar, la barra
saltaría de cero al total: durante los minutos del medio, un lote que avanza
normalmente y uno que se colgó se verían exactamente igual, y no habría forma de
distinguirlos sin entrar a mirar los registros del servidor.
"""

import pytest

from apps.coverage import services
from apps.coverage.services import inspect_domain
from apps.jobs.models import Batch, BatchOrigin, BatchState
from apps.sitemaps.models import Url
from tests.doubles import FakeClient, response
from tests.factories import create_account, create_credential, create_domain

pytestmark = pytest.mark.django_db


@pytest.fixture
def domain():
    account = create_account()
    create_credential(account)
    return create_domain(account, daily_inspection_budget=100, manual_reserve=50)


def urls(domain, count: int) -> list[Url]:
    return [
        Url.objects.create(domain=domain, loc=f'https://ejemplo.test/{index}', in_sitemap=True)
        for index in range(count)
    ]


def test_the_progress_is_written_while_the_batch_runs(domain, monkeypatch):
    """
    Se mira desde la base y no desde el objeto en memoria.

    Lo que la pantalla lee es la fila, no la variable del trabajador: un contador
    que crece sólo en memoria no la mueve un milímetro.
    """
    monkeypatch.setattr(services, 'PROGRESS_EVERY', 2)
    seen: list[int] = []

    def answer():
        batch = Batch.objects.order_by('-created_at').first()
        if batch is not None:
            seen.append(batch.processed_items)
        return response('url_inspection_indexada')

    inspect_domain(
        domain,
        origin=BatchOrigin.MANUAL,
        urls=urls(domain, 5),
        client=FakeClient(inspect_url=answer),
    )

    # La quinta consulta ya ve escritas las cuatro anteriores: sin el informe por
    # trozos, todas las lecturas serían cero.
    assert seen == [0, 0, 2, 2, 4]


def test_the_final_figures_are_the_real_ones(domain, monkeypatch):
    monkeypatch.setattr(services, 'PROGRESS_EVERY', 2)

    batch = inspect_domain(
        domain,
        origin=BatchOrigin.MANUAL,
        urls=urls(domain, 5),
        client=FakeClient(inspect_url=response('url_inspection_indexada')),
    )

    batch.refresh_from_db()
    assert batch.state == BatchState.COMPLETED
    assert batch.processed_items == 5
    assert batch.total_items == 5
