from celery import Celery
from celery.signals import worker_process_init

from app.core.config import settings
from app.core.database import reset_client
from app.core.logger import logger
from app.qdrant.bootstrap import bootstrap_qdrant

# Create Celery app
celery_app = Celery(
    settings.APP_NAME,
    broker=settings.CELERY_BROKER_URL,
    backend=settings.CELERY_RESULT_BACKEND,
    include=["app.workers.embedding_tasks", "app.workers.pipeline_tasks"],
)

# Celery configuration
celery_app.conf.update(
    task_serializer="json",
    accept_content=["json"],
    result_serializer="json",
    timezone="UTC",
    enable_utc=True,
    task_track_started=True,
    task_time_limit=settings.CELERY_TASK_TIME_LIMIT_SEC,
    task_soft_time_limit=settings.CELERY_TASK_SOFT_TIME_LIMIT_SEC,
    worker_prefetch_multiplier=1,
    worker_concurrency=settings.CELERY_WORKER_CONCURRENCY,
    worker_max_tasks_per_child=1000,
    task_autoretry_for=(Exception,),
    task_max_retries=settings.RETRY_MAX_ATTEMPTS,
    task_default_retry_delay=60,
)


@celery_app.task(bind=True)
def debug_task(self):
    """Debug task for testing Celery setup."""
    logger.info(f"Debug task request: {self.request}")
    return "Debug task completed"


logger.info(f"Celery app initialized with broker: {settings.CELERY_BROKER_URL}")


@worker_process_init.connect
def _bootstrap_qdrant_on_worker_start(**_kwargs) -> None:
    reset_client()
    try:
        bootstrap_qdrant()
    except Exception as exc:
        logger.error(f"Qdrant bootstrap failed on Celery worker start: {exc}")
        raise
