"""Relink Magento listing-path targets and drop stale taxonomy category assignments.

Examples:
    python -m app.jobs.repair_magento_listing_path_targets --dry-run
    python -m app.jobs.repair_magento_listing_path_targets --dry-run --connection-id 1
    python -m app.jobs.repair_magento_listing_path_targets --apply --connection-id 1
    python -m app.jobs.repair_magento_listing_path_targets --dry-run --connection-id 1 --provision-unmatched
    python -m app.jobs.repair_magento_listing_path_targets --apply --connection-id 1 --provision-unmatched
"""

from __future__ import annotations

import argparse
import json
import sys

from db.repair_magento_listing_path_targets import repair_magento_listing_path_targets
from db.session import get_session


def main() -> int:
    parser = argparse.ArgumentParser(description="Repair Magento listing-path category target links")
    parser.add_argument("--connection-id", type=int, default=None)
    parser.add_argument("--path-slug", default=None, help="Limit to one PLP path slug")
    parser.add_argument("--apply", action="store_true", help="Persist relinks / deactivations")
    parser.add_argument("--dry-run", action="store_true", help="Preview only (default unless --apply)")
    parser.add_argument(
        "--provision-unmatched",
        action="store_true",
        help="Create Magento categories for unmatched PLP slugs (blocked while taxonomy invent is frozen)",
    )
    parser.add_argument(
        "--no-prune-assignments",
        action="store_true",
        help="Do not deactivate stale product_channel_taxonomy_assignment rows",
    )
    parser.add_argument(
        "--no-deactivate-invalid-masters",
        action="store_true",
        help="Do not deactivate wrong hub/collection/facet master listing paths",
    )
    args = parser.parse_args()

    dry_run = not args.apply
    with get_session() as session:
        result = repair_magento_listing_path_targets(
            session,
            connection_id=args.connection_id,
            dry_run=dry_run,
            prune_stale_assignments=not args.no_prune_assignments,
            deactivate_invalid_collection_facet_masters=not args.no_deactivate_invalid_masters,
            provision_unmatched=args.provision_unmatched,
            path_slug=args.path_slug,
        )
        if not dry_run:
            session.commit()
    print(json.dumps(result, indent=2, default=str))
    return 0 if result.get("unmatched_count", 0) == 0 or args.provision_unmatched else 1


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