"""Push assigned master products to Shopify via productSet.

CLI:
    python -m app.jobs.shopify_push --dry-run
    python -m app.jobs.shopify_push --limit 10
    python -m app.jobs.shopify_push --skus SKU1 SKU2 --no-dry-run
"""

from __future__ import annotations

import argparse
import json
import logging
import sys

logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)


def run_shopify_push(
    *,
    dry_run: bool = True,
    limit: int | None = None,
    skus: list[str] | None = None,
    shop_code: str | None = None,
    force: bool = False,
) -> dict:
    from db.session import get_session
    from shopify.product_sync import push_products

    with get_session() as session:
        summary = push_products(
            session,
            dry_run=dry_run,
            limit=limit,
            skus=skus,
            shop_code=shop_code,
            force=force,
        )
        session.commit()
    return summary


def main() -> int:
    parser = argparse.ArgumentParser(description="Push master products to Shopify")
    parser.add_argument("--dry-run", dest="dry_run", action="store_true", default=True)
    parser.add_argument("--no-dry-run", dest="dry_run", action="store_false", help="Actually call Shopify")
    parser.add_argument("--limit", type=int, default=None)
    parser.add_argument("--skus", nargs="*", default=None)
    parser.add_argument("--shop-code", default=None)
    parser.add_argument("--force", action="store_true", help="Push even when payload hash is unchanged")
    args = parser.parse_args()

    summary = run_shopify_push(
        dry_run=args.dry_run,
        limit=args.limit,
        skus=args.skus,
        shop_code=args.shop_code,
        force=args.force,
    )
    print(json.dumps(summary, indent=2, default=str))
    return 0 if summary.get("status") in {"ok"} and not summary.get("failed") else 1


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