"""Rename remote channel SKUs to match prefix rules (no master product data push).

After link_master_skus, Shopify often still has master SKUs (HPW-100) while prefix
targets (HD-CW-100) do not exist yet. This job renames the live variant SKU and
updates channel_sku_mapping — no product attribute push.

Workflow:
    python -m app.jobs.link_master_skus
    python -m app.jobs.rename_channel_skus --dry-run --channels shopify
    python -m app.jobs.rename_channel_skus --no-dry-run --channels shopify --limit 50
"""

from __future__ import annotations

import argparse
import json
import sys

from db.channel_sku_rename import apply_channel_sku_renames
from db.session import get_session


def run_rename_channel_skus(
    *,
    dry_run: bool = True,
    only_assigned: bool = False,
    linked_only: bool = True,
    channels: list[str] | None = None,
    skus: list[str] | None = None,
    limit: int | None = None,
    magento_connection_id: int | None = None,
    shopify_connection_id: int | None = None,
) -> dict:
    with get_session() as session:
        summary = apply_channel_sku_renames(
            session,
            channels=channels,
            only_assigned=only_assigned,
            linked_only=linked_only,
            dry_run=dry_run,
            skus=skus,
            limit=limit,
            magento_connection_id=magento_connection_id,
            shopify_connection_id=shopify_connection_id,
        )
    return summary


def main() -> int:
    parser = argparse.ArgumentParser(
        description="Rename linked remote SKUs to prefix targets (Shopify/Magento; no attribute push)"
    )
    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="Apply renames on remote")
    parser.add_argument("--only-assigned", action="store_true")
    parser.add_argument(
        "--all-masters",
        action="store_true",
        help="Include unlinked masters too (default: only linked mappings)",
    )
    parser.add_argument(
        "--channels",
        nargs="+",
        default=None,
        choices=["shopify", "magento", "plytix"],
        help="Channels to rename (default: shopify + magento)",
    )
    parser.add_argument("--skus", nargs="*", default=None, help="Limit to specific master SKUs")
    parser.add_argument("--limit", type=int, default=None, help="Max renames per channel")
    parser.add_argument("--magento-connection-id", type=int, default=None)
    parser.add_argument("--shopify-connection-id", type=int, default=None)
    args = parser.parse_args()

    summary = run_rename_channel_skus(
        dry_run=args.dry_run,
        only_assigned=args.only_assigned,
        linked_only=not args.all_masters,
        channels=args.channels,
        skus=args.skus,
        limit=args.limit,
        magento_connection_id=args.magento_connection_id,
        shopify_connection_id=args.shopify_connection_id,
    )
    print(json.dumps(summary, indent=2, default=str))
    failed = sum(
        len(ch.get("failed") or [])
        for ch in (summary.get("channels") or {}).values()
        if isinstance(ch, dict)
    )
    return 0 if summary.get("status") in {"ok", "partial"} and failed == 0 else 1


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