"""Align existing channel_sku_mapping rows with prefix rules (incl. RTA- mirrors).

Use after enabling RTA-aware prefix resolution or bootstrapping Shopify prefix rules.

Workflow:
    # Preview DB mapping fixes + remote rename plan
    python -m app.jobs.repair_channel_sku_mappings --dry-run

    # Fix mapping rows only (safe when remote not linked yet)
    python -m app.jobs.repair_channel_sku_mappings --no-dry-run

    # Rename live Shopify/Magento SKUs, then sync any remaining mapping rows
    python -m app.jobs.repair_channel_sku_mappings --no-dry-run --rename-remote

    # RTA mirror SKUs only
    python -m app.jobs.repair_channel_sku_mappings --dry-run --rta-only
"""

from __future__ import annotations

import argparse
import json
import sys

from db.channel_sku_mapping_repair import repair_channel_sku_mappings
from db.session import get_session


def main() -> int:
    parser = argparse.ArgumentParser(
        description="Repair channel_sku_mapping rows to match prefix rules (RTA- aware)"
    )
    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="Persist mapping fixes")
    parser.add_argument(
        "--rename-remote",
        action="store_true",
        help="Also rename linked remote SKUs (Shopify/Magento) before syncing mappings",
    )
    parser.add_argument(
        "--channels",
        nargs="+",
        default=["shopify"],
        choices=["shopify", "magento"],
        help="Channels to repair (default: shopify)",
    )
    parser.add_argument("--only-assigned", action="store_true", help="Limit to channel-assigned master SKUs")
    parser.add_argument("--rta-only", action="store_true", help="Only repair RTA- master SKUs")
    parser.add_argument("--skus", nargs="*", default=None, help="Limit to specific master SKUs")
    parser.add_argument("--limit", type=int, default=None, help="Max remote renames per channel")
    parser.add_argument("--connection-id", type=int, default=None, help="Compat connection id override")
    parser.add_argument("--magento-connection-id", type=int, default=None)
    parser.add_argument("--shopify-connection-id", type=int, default=None)
    args = parser.parse_args()

    with get_session() as session:
        summary = repair_channel_sku_mappings(
            session,
            channels=args.channels,
            connection_id=args.connection_id,
            only_assigned=args.only_assigned,
            skus=args.skus,
            rta_only=args.rta_only,
            dry_run=args.dry_run,
            rename_remote=args.rename_remote,
            rename_limit=args.limit,
            magento_connection_id=args.magento_connection_id,
            shopify_connection_id=args.shopify_connection_id,
        )
        if not args.dry_run:
            session.commit()

    print(json.dumps(summary, indent=2, default=str))

    if summary.get("status") == "partial":
        return 1
    failed = 0
    remote = summary.get("remote_rename") or {}
    for ch in (remote.get("channels") or {}).values():
        if isinstance(ch, dict):
            failed += len(ch.get("failed") or [])
    return 0 if failed == 0 else 1


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