"""
Aplicacion Celery del proyecto.

El envio se delega a un worker para que la peticion HTTP no quede bloqueada
esperando la respuesta del proveedor, y para poder reintentar los fallos
temporales sin que el cliente tenga que hacerlo.
"""

from __future__ import annotations

import os

from celery import Celery
from celery.signals import task_prerun

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "core.settings")

app = Celery("notificaciones")

# Toma toda la configuracion de Django cuyo nombre empiece por CELERY_.
app.config_from_object("django.conf:settings", namespace="CELERY")

# Descubre `tasks.py` en cada aplicacion instalada.
app.autodiscover_tasks()


@task_prerun.connect
def _bind_request_id(task_id=None, task=None, kwargs=None, **_):
    """
    Propaga el identificador de correlacion desde la peticion HTTP que encolo
    la tarea, para poder seguir un envio de punta a punta en los registros.
    """
    from core.logging_utils import request_id_var

    request_id = (kwargs or {}).get("request_id")
    request_id_var.set(request_id or f"task-{task_id}")
