"""작업 관리자 — 현재는 threading 기반, 향후 Celery/ARQ로 교체 가능.

모든 백그라운드 작업은 이 모듈을 통해 실행하여 일관된 추적/복구를 보장.
"""
import logging
import threading
from typing import Callable, Optional
from app.core.task_registry import register_task, unregister_task

logger = logging.getLogger(__name__)


def submit_background_job(
    job_key: str,
    target: Callable,
    args: tuple = (),
    description: str = "",
) -> bool:
    """백그라운드 작업 제출. 이미 실행 중이면 False 반환.

    향후 Celery로 교체 시 이 함수만 수정하면 됨.
    """
    def _wrapper():
        try:
            target(*args)
        except Exception as exc:
            logger.error("Background job '%s' failed: %s", job_key, exc, exc_info=True)
        finally:
            unregister_task(job_key)

    thread = threading.Thread(target=_wrapper, daemon=True)
    if not register_task(job_key, thread):
        logger.warning("Job '%s' is already running, skipping", job_key)
        return False

    logger.info("Starting background job: %s (%s)", job_key, description)
    try:
        thread.start()
    except Exception:
        unregister_task(job_key)
        raise
    return True
