from __future__ import annotations

import argparse
import json
from typing import Optional, Sequence


def run_v2_backfill(
    *,
    apply: bool,
    sku_limit: Optional[int] = None,
    skus: Optional[Sequence[str]] = None,
    sku_offset: int = 0,
    reset: bool = False,
) -> dict:
    from db.session import get_session
    from db.v2_backfill import run_v2_foundation_backfill

    with get_session() as session:
        summary = run_v2_foundation_backfill(
            session,
            sku_limit=sku_limit,
            skus=skus,
            sku_offset=sku_offset,
            reset=reset,
        )
        if apply:
            session.commit()
        else:
            session.rollback()
    return {
        "status": "ok",
        "applied": bool(apply),
        "summary": summary,
    }


def main(argv: Optional[Sequence[str]] = None) -> int:
    parser = argparse.ArgumentParser(description="Backfill live master catalog data into v2 foundation tables")
    parser.add_argument("--apply", action="store_true", help="Commit writes to v2 tables. Default is dry-run.")
    parser.add_argument("--sku-limit", type=int, help="Backfill only the first N master products for smoke testing")
    parser.add_argument("--sku-offset", type=int, default=0, help="Skip the first N master products before loading")
    parser.add_argument("--sku", action="append", default=[], help="Backfill only these SKUs; repeatable")
    parser.add_argument("--reset", action="store_true", help="Clear existing v2 foundation tables before loading")
    args = parser.parse_args(list(argv) if argv is not None else None)

    result = run_v2_backfill(
        apply=args.apply,
        sku_limit=args.sku_limit,
        skus=args.sku,
        sku_offset=args.sku_offset,
        reset=args.reset,
    )
    print(json.dumps(result, indent=2, sort_keys=True))
    return 0


if __name__ == "__main__":
    raise SystemExit(main())
