"""Background refresh for channel pipeline readiness cache.

Queue default scopes (magento/shopify/plytix, assigned-only):
    python -m app.jobs.refresh_channel_readiness --queue-all

Process one queued refresh (same as the API worker loop):
    python -m app.jobs.refresh_channel_readiness --once

Continuous worker (cron-friendly alternative to in-process FastAPI thread):
    python -m app.jobs.refresh_channel_readiness --poll 60
"""

from __future__ import annotations

import argparse
import json
import logging
import os
import sys
import time

from db.channel_readiness_cache import (
    DEFAULT_REFRESH_HOURS,
    enqueue_stale_readiness_refreshes,
    process_one_readiness_refresh,
    queue_default_pipeline_readiness_refreshes,
)
from db.session import get_session


logger = logging.getLogger(__name__)


def run_refresh_pass(
    *,
    queue_all: bool = False,
    queue_stale: bool = True,
    process: bool = True,
    worker_id: str | None = None,
) -> dict:
    worker = worker_id or f"readiness-worker-{os.getpid()}"
    summary = {"queued_all": 0, "queued_stale": 0, "processed": False, "worker_id": worker}
    with get_session() as session:
        if queue_all:
            summary["queued_all"] = queue_default_pipeline_readiness_refreshes(session, force=True)
        if queue_stale:
            summary["queued_stale"] = enqueue_stale_readiness_refreshes(session)
        if process:
            try:
                summary["processed"] = process_one_readiness_refresh(session, worker_id=worker)
            except Exception as exc:
                summary["processed"] = True
                summary["error"] = str(exc)
        session.commit()
    return summary


def main() -> int:
    logging.basicConfig(level=logging.INFO)
    parser = argparse.ArgumentParser(description="Queue/process channel pipeline readiness cache")
    parser.add_argument("--queue-all", action="store_true", help="Queue all default pipeline scopes")
    parser.add_argument(
        "--no-queue-stale",
        action="store_true",
        help=f"Skip auto-queue of caches older than {DEFAULT_REFRESH_HOURS}h",
    )
    parser.add_argument("--once", action="store_true", help="Run one pass (queue stale + process one) and exit")
    parser.add_argument("--poll", type=int, default=0, help="Continuous loop; seconds between idle polls")
    parser.add_argument("--process-only", action="store_true", help="Do not queue; only process one job")
    parser.add_argument("--queue-only", action="store_true", help="Only queue; do not process")
    args = parser.parse_args()

    queue_stale = not args.no_queue_stale
    process = not args.queue_only
    queue_all = args.queue_all

    if args.poll:
        logger.info("readiness-worker: started poll=%ss refresh_hours=%s", args.poll, DEFAULT_REFRESH_HOURS)
        while True:
            summary = run_refresh_pass(queue_all=queue_all, queue_stale=queue_stale, process=process)
            if summary.get("processed") or summary.get("queued_all") or summary.get("queued_stale"):
                logger.info("readiness-worker: %s", summary)
            queue_all = False
            if not summary.get("processed"):
                time.sleep(args.poll)
        return 0

    summary = run_refresh_pass(
        queue_all=queue_all,
        queue_stale=queue_stale and not args.process_only,
        process=process,
    )
    print(json.dumps(summary, indent=2, default=str))
    return 0 if not summary.get("error") else 1


if __name__ == "__main__":
    sys.exit(main())
