from __future__ import annotations

import json
import logging
from typing import Any

from app.config import get_settings

logger = logging.getLogger(__name__)


def publish_campaign_run(
    campaign_id: int,
    business_id: int,
    retry_only: bool,
    priority_only: bool,
    business_name: str | None,
) -> None:
    """
    Mirrors RabbitMQCampaignPublisher::publish — best-effort AMQP publish when RABBITMQ_URL set.
    """
    settings = get_settings()
    if not settings.rabbitmq_url:
        logger.debug("RabbitMQ not configured; skip publish")
        return
    try:
        import pika

        params = pika.URLParameters(settings.rabbitmq_url)
        conn = pika.BlockingConnection(params)
        ch = conn.channel()
        ch.exchange_declare(exchange=settings.rabbitmq_exchange, exchange_type="topic", durable=True)
        body: dict[str, Any] = {
            "campaign_id": campaign_id,
            "business_id": business_id,
            "retry_only": retry_only,
            "priority_only": priority_only,
            "business_name": business_name,
        }
        routing_key = f"campaign.{business_id}.{campaign_id}"
        ch.basic_publish(
            exchange=settings.rabbitmq_exchange,
            routing_key=routing_key,
            body=json.dumps(body).encode("utf-8"),
            properties=pika.BasicProperties(delivery_mode=2),
        )
        conn.close()
    except Exception as e:  # noqa: BLE001
        logger.warning("RabbitMQ publish failed: %s", e)


def delete_queue_for_campaign(business_id: int, campaign_id: int) -> None:
    """
    Mirrors RabbitMQCampaignQueueService::deleteQueueForCampaign — optional.
    """
    settings = get_settings()
    if not settings.rabbitmq_url:
        return
    try:
        import pika

        params = pika.URLParameters(settings.rabbitmq_url)
        conn = pika.BlockingConnection(params)
        ch = conn.channel()
        queue_name = f"{business_id}_{campaign_id}_campaign"
        ch.queue_delete(queue=queue_name)
        conn.close()
    except Exception as e:  # noqa: BLE001
        logger.warning("RabbitMQ queue delete failed: %s", e)


def trigger_call_history_sync(business_id: int, outbound: bool = True) -> None:
    """
    Placeholder for CallHistorySyncHelper::triggerSyncForBusiness — log only unless extended.
    """
    logger.info("CallHistorySyncHelper.triggerSyncForBusiness business_id=%s outbound=%s", business_id, outbound)
