from __future__ import annotations

import logging

from app.database import session_scope_cluster, session_scope_default
from app.services import campaign_core
from app.services.campaign_service import run_campaign
from app.workers.celery_app import celery_app

logger = logging.getLogger(__name__)


@celery_app.task(name="process_campaign", bind=True, max_retries=3, time_limit=3600, soft_time_limit=3500)
def process_campaign_task(
    self,
    campaign_id: int,
    business_id: int,
    retry_only: bool = False,
    priority_only: bool = False,
):
    with session_scope_default() as sd, session_scope_cluster() as sc:
        result = run_campaign(
            sd,
            sc,
            int(business_id),
            int(campaign_id),
            None,
            None,
            None,
            None,
            bool(retry_only),
            bool(priority_only),
        )
        if retry_only and isinstance(result, dict) and result.get("success") is True:
            campaign_core.update_waiting_time_after_retry(sc, int(campaign_id), int(business_id), result)
        return result


@celery_app.task(name="process_retry_calls_cron", time_limit=1800)
def process_retry_calls_cron():
    """Enqueue from full cron implementation in router (optional)."""
    logger.info("process_retry_calls_cron stub — use HTTP cron or expand to call service")
