"""Link channel catalog SKUs to master products (channel-first).

Scans what exists on Magento / Shopify / Plytix and links each remote SKU
to a master when matched (exact SKU, prefix reverse, source_item, normalized).

CLI:
    python -m app.jobs.link_master_skus --dry-run
    python -m app.jobs.link_master_skus
    python -m app.jobs.link_master_skus --assign-all
    python -m app.jobs.link_master_skus --channels shopify magento
"""

from __future__ import annotations

import argparse
import json
import sys

from db.channel_sku_link import scan_and_link_channels
from db.session import get_session


def run_link_master_skus(
    *,
    dry_run: bool = False,
    assign_all: bool = False,
    channels: list[str] | None = None,
    magento_connection_id: int | None = None,
    shopify_connection_id: int | None = None,
) -> dict:
    with get_session() as session:
        summary = scan_and_link_channels(
            session,
            channels=channels,
            assign_all=assign_all,
            dry_run=dry_run,
            magento_connection_id=magento_connection_id,
            shopify_connection_id=shopify_connection_id,
        )
    return summary


def main() -> int:
    parser = argparse.ArgumentParser(
        description="Scan channel catalogs and link remote SKUs to master products (channel-first)"
    )
    parser.add_argument("--dry-run", action="store_true", help="Preview links without writing")
    parser.add_argument(
        "--assign-all",
        action="store_true",
        help="Also assign every active master SKU to each channel (for later push scope)",
    )
    parser.add_argument(
        "--channels",
        nargs="+",
        default=None,
        choices=["magento", "shopify", "plytix"],
        help="Channels to scan (default: all three)",
    )
    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_link_master_skus(
        dry_run=args.dry_run,
        assign_all=args.assign_all,
        channels=args.channels,
        magento_connection_id=args.magento_connection_id,
        shopify_connection_id=args.shopify_connection_id,
    )
    print(json.dumps(summary, indent=2, default=str))
    return 0 if summary.get("status") in {"ok", "partial"} else 1


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