"""Export variation parent shells with children and option axis values.

CLI:
    python -m app.jobs.export_variation_parents --output variation_parents.csv
    python -m app.jobs.export_variation_parents --output variation_parents.csv --parent-skus ACH-B-PARENT,ACH-SB-PARENT
"""

from __future__ import annotations

import argparse
import csv
import json
import sys
from pathlib import Path
from typing import List, Optional, Sequence


BASE_FIELDS = [
    "parent_sku",
    "parent_name",
    "parent_collection",
    "option_attrs",
    "option_label",
    "magento_configurable_attributes",
    "variant_list",
    "variant_of",
    "configurable_variation_labels",
    "configurable_variations",
    "child_sku",
    "child_name",
    "sort_order",
    "link_source",
    "explicit_seo_title",
]


def run_export_variation_parents(
    output_path: str,
    *,
    parent_skus: Optional[Sequence[str]] = None,
) -> dict:
    from db.session import get_session
    from db.variation_builder import export_variation_parent_child_rows

    with get_session() as session:
        result = export_variation_parent_child_rows(session, parent_skus=parent_skus)

    rows = result.get("rows") or []
    option_attrs = list(result.get("option_attrs") or [])
    fieldnames = BASE_FIELDS + [code for code in option_attrs if code not in BASE_FIELDS]

    path = Path(output_path)
    path.parent.mkdir(parents=True, exist_ok=True)
    with path.open("w", newline="", encoding="utf-8") as handle:
        writer = csv.DictWriter(handle, fieldnames=fieldnames, extrasaction="ignore")
        writer.writeheader()
        for row in rows:
            writer.writerow({key: row.get(key, "") for key in fieldnames})

    return {
        "status": "ok",
        "output": str(path),
        "rows": len(rows),
        "parent_count": result.get("parent_count") or 0,
        "child_count": result.get("child_count") or 0,
        "option_attrs": option_attrs,
    }


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="Export variation parent/child CSV with option axes")
    parser.add_argument("--output", required=True, help="Output CSV path")
    parser.add_argument(
        "--parent-skus",
        default=None,
        help="Optional comma-separated parent SKU filter",
    )
    args = parser.parse_args()

    result = run_export_variation_parents(args.output, parent_skus=_parse_sku_list(args.parent_skus) or None)
    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__":
    sys.exit(main())
