from __future__ import annotations

import argparse
import json
from pathlib import Path
from typing import Optional, Sequence


def run_v2_attribute_seed(
    *,
    apply: bool,
    dry_run: bool = False,
    reset: bool = False,
    overrides_path: str | None = None,
    export_overrides_path: str | None = None,
    report_path: str | None = None,
) -> dict:
    from db.session import get_session
    from db.v2_attribute_review import export_override_payload
    from db.v2_attribute_seed import seed_v2_attributes

    overrides = None
    if overrides_path:
        overrides = json.loads(Path(overrides_path).read_text(encoding="utf-8"))

    with get_session() as session:
        summary = seed_v2_attributes(session, apply=apply, reset=reset, overrides=overrides)
        if export_overrides_path:
            Path(export_overrides_path).write_text(
                json.dumps(export_override_payload(session), indent=2),
                encoding="utf-8",
            )
        if report_path:
            Path(report_path).write_text(
                json.dumps(summary.get("report") or {}, indent=2),
                encoding="utf-8",
            )
        if dry_run:
            session.rollback()
        else:
            session.commit()
    return {
        "status": "ok",
        "applied": bool(apply) and not dry_run,
        "persisted_candidates": not dry_run,
        "summary": summary,
    }


def main(argv: Optional[Sequence[str]] = None) -> int:
    parser = argparse.ArgumentParser(
        description="Discover V1 attributes as V2 seed candidates, then apply approved review decisions."
    )
    parser.add_argument(
        "--apply",
        action="store_true",
        help="Write approved/modified candidates into v2_attribute. Default only discovers candidates.",
    )
    parser.add_argument(
        "--dry-run",
        action="store_true",
        help="Discover and report without persisting candidates or applying.",
    )
    parser.add_argument(
        "--reset",
        action="store_true",
        help="Clear existing seed candidates before rediscovering. Does not delete live v2_attribute rows.",
    )
    parser.add_argument("--overrides", help="JSON file of review decisions to apply after discover.")
    parser.add_argument("--export-overrides", help="Write current review decisions to a JSON file.")
    parser.add_argument("--report", help="Write the detailed review report JSON to a file.")
    args = parser.parse_args(list(argv) if argv is not None else None)

    result = run_v2_attribute_seed(
        apply=args.apply,
        dry_run=args.dry_run,
        reset=args.reset,
        overrides_path=args.overrides,
        export_overrides_path=args.export_overrides,
        report_path=args.report,
    )
    print(json.dumps(result, indent=2, sort_keys=True, default=str))
    return 0


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