"""
Celery Task Dispatch Helper
===========================

Platform-aware Celery task dispatching utility.
Uses apply_async on Windows (solo pool) and send_task on Linux (prefork pool).

Usage:
    from src.smart_inventory.utils.celery_dispatch import dispatch_task
    
    # Instead of: compute_daily_sales.delay(target_date)
    result = dispatch_task(
        "src.smart_inventory.tasks.daily_sales_task.compute_daily_sales",
        kwargs={"target_date": target_date}
    )
"""

import sys
import logging
from typing import Dict, Any, Optional

logger = logging.getLogger(__name__)


def dispatch_task(
    task_name: str,
    args: tuple = None,
    kwargs: Dict[str, Any] = None,
    task_id: Optional[str] = None,
    countdown: Optional[int] = None
):
    """
    Dispatch a Celery task with platform-specific handling.
    
    Windows (solo pool): Uses direct task import and apply_async
    Linux (prefork pool): Uses send_task with task name string
    
    Args:
        task_name: Full Celery task name (e.g., "src.smart_inventory.tasks.daily_sales_task.compute_daily_sales")
        args: Positional arguments for the task
        kwargs: Keyword arguments for the task
        task_id: Optional task ID to use
        countdown: Optional delay in seconds before task execution
        
    Returns:
        AsyncResult or task ID string
    """
    from src.utils.celery_worker import celery_app
    
    if args is None:
        args = ()
    if kwargs is None:
        kwargs = {}
    
    try:
        if sys.platform == 'win32':
            # Windows: use direct task import and apply_async
            task = celery_app.tasks.get(task_name)
            if task:
                return task.apply_async(
                    args=args,
                    kwargs=kwargs,
                    task_id=task_id,
                    countdown=countdown
                )
            else:
                # Fallback to send_task if task not in registry
                logger.debug(f"Task {task_name} not in registry, using send_task")
                return celery_app.send_task(
                    task_name,
                    args=args,
                    kwargs=kwargs,
                    task_id=task_id,
                    countdown=countdown
                )
        else:
            # Linux: use send_task with task name for prefork pool compatibility
            return celery_app.send_task(
                task_name,
                args=args,
                kwargs=kwargs,
                task_id=task_id,
                countdown=countdown
            )
    except Exception as e:
        logger.error(f"Failed to dispatch task {task_name}: {e}")
        raise
