"""Trabajo diferido de indexación."""

import logging

from celery import shared_task

from apps.core.errors import ApiError

logger = logging.getLogger(__name__)


@shared_task(name='apps.indexing.tasks.send_indexing_batch')
def send_indexing_batch(batch_id: str) -> dict:
    """
    Manda los pedidos pendientes de un lote encolado.

    Se toma sólo si el lote sigue en `QUEUED`, igual que la inspección y la
    exportación. Celery reconoce las tareas al terminar, así que una que muera a
    mitad vuelve a la cola: sin esta condición, el segundo intento reenviaría a
    Google direcciones que ya salieron, y cada reenvío gasta del techo real.
    """
    from django.utils import timezone

    from apps.indexing.services import send_batch
    from apps.jobs.models import Batch, BatchState

    batch = (
        Batch.objects.filter(id=batch_id, state=BatchState.QUEUED)
        .select_related('domain', 'domain__account')
        .first()
    )
    if batch is None:
        return {'skipped': 'el lote ya no está en cola'}

    try:
        batch = send_batch(batch)
    except ApiError as exc:
        logger.warning('No se enviaron los pedidos de %s: %s', batch_id, exc.message)
        batch.state = BatchState.FAILED
        batch.finished_at = timezone.now()
        batch.summary = {'errors': [exc.message]}
        batch.save(update_fields=['state', 'finished_at', 'summary', 'updated_at'])
        return {'skipped': exc.code, 'detail': exc.message}

    return {'batch_id': str(batch.id), 'state': batch.state, 'summary': batch.summary}
