from __future__ import annotations

import logging

from sqlalchemy import text
from sqlalchemy.orm import Session

from app.config import get_settings
from app.utils.rabbitmq_campaign import publish_campaign_run
from app.workers.tasks import process_campaign_task

logger = logging.getLogger(__name__)


def dispatch_campaign_to_queue(
    session_default: Session,
    campaign_id: int,
    business_id: int,
    retry_only: bool = False,
    priority_only: bool = False,
    laravel_queue: str | None = None,
    business_name: str | None = None,
) -> None:
    settings = get_settings()
    q = laravel_queue or settings.queue_first_campaign
    if business_name is None:
        row = session_default.execute(
            text("SELECT business_name FROM businesses WHERE business_id = :bid LIMIT 1"),
            {"bid": business_id},
        ).first()
        business_name = str(row[0]) if row and row[0] else None

    opts = {}
    if q == settings.queue_priority:
        opts["queue"] = settings.queue_priority

    process_campaign_task.apply_async(
        args=[campaign_id, business_id, retry_only, priority_only],
        **opts,
    )
    publish_campaign_run(campaign_id, business_id, retry_only, priority_only, business_name)
