"""Backfill master_product_relation from variation_builder parent raw_payload.

Fixes parents that have children only in raw_payload (so Magento never gets
variant_list / variant_of / configurable_variations), and cleans polluted
option_attrs that include variation_option_label.

CLI:
    python -m app.jobs.repair_variation_relations --dry-run
    python -m app.jobs.repair_variation_relations
    python -m app.jobs.repair_variation_relations --parent-skus ACH-B-PARENT,ACH-SB-PARENT
"""

from __future__ import annotations

import argparse
import json
import logging
import sys
from typing import List, Optional


def run_repair_variation_relations(
    *,
    parent_skus: Optional[List[str]] = None,
    dry_run: bool = False,
) -> dict:
    from db.session import get_session
    from db.variation_builder import repair_variation_relations_from_payload

    with get_session() as session:
        result = repair_variation_relations_from_payload(
            session,
            parent_skus=parent_skus,
            dry_run=dry_run,
        )
        if not dry_run:
            session.commit()
    return result


def _parse_sku_list(raw: Optional[str]) -> List[str]:
    if not raw:
        return []
    return [part.strip() for part in raw.split(",") if part.strip()]


def main() -> int:
    parser = argparse.ArgumentParser(
        description="Backfill variation parent/child relations and clean option_attrs"
    )
    parser.add_argument("--dry-run", action="store_true", help="Preview without writing")
    parser.add_argument(
        "--parent-skus",
        default=None,
        help="Optional comma-separated parent SKU filter",
    )
    args = parser.parse_args()

    result = run_repair_variation_relations(
        parent_skus=_parse_sku_list(args.parent_skus) or None,
        dry_run=args.dry_run,
    )
    if result.get("status") != "ok":
        print(result.get("error", "unknown error"), file=sys.stderr)
        return 1
    print(json.dumps(result, indent=2, sort_keys=True))
    return 0


if __name__ == "__main__":
    logging.basicConfig(level=logging.INFO)
    sys.exit(main())
