"""Rewrite taxonomy/brochure JSON on disk, stripping polluted clearance-kit collection nests.

Examples:
  python -m app.jobs.sanitize_kitchen_collection_json \\
      --taxonomy-file ../plytixftp.../kitchen_cabinets_taxonomy.json --apply
  python -m app.jobs.sanitize_kitchen_collection_json \\
      --brochure-folder ../plytixftp.../brochure_json_3 --apply
"""

from __future__ import annotations

import argparse
import json
import sys
from pathlib import Path
from typing import Any, Dict, List


def rewrite_taxonomy_json(path: str | Path, *, apply: bool = False) -> Dict[str, Any]:
    from db.kitchen_cabinets_taxonomy_import import sanitize_kitchen_cabinets_taxonomy_payload

    file_path = Path(path)
    original = json.loads(file_path.read_text(encoding="utf-8"))
    result = sanitize_kitchen_cabinets_taxonomy_payload(original)
    cleaned = result["payload"]
    changed = json.dumps(original, sort_keys=True) != json.dumps(cleaned, sort_keys=True)
    if apply and changed:
        file_path.write_text(json.dumps(cleaned, indent=2, ensure_ascii=False) + "\n", encoding="utf-8")
    return {
        "file": str(file_path),
        "changed": changed,
        "applied": bool(apply and changed),
        "removed_collections": result.get("removed_collections") or [],
        "removed_paths": result.get("removed_paths") or [],
    }


def rewrite_brochure_folder(folder: str | Path, *, apply: bool = False) -> Dict[str, Any]:
    from db.kitchen_cabinets_taxonomy_import import sanitize_brochure_collection_payload

    folder_path = Path(folder)
    files: List[Dict[str, Any]] = []
    changed_count = 0
    for path in sorted(folder_path.glob("*.json")):
        original = json.loads(path.read_text(encoding="utf-8"))
        result = sanitize_brochure_collection_payload(original)
        cleaned = result["payload"]
        changed = json.dumps(original, sort_keys=True) != json.dumps(cleaned, sort_keys=True)
        if changed:
            changed_count += 1
        if apply and changed:
            path.write_text(json.dumps(cleaned, indent=2, ensure_ascii=False) + "\n", encoding="utf-8")
        files.append(
            {
                "file": str(path),
                "changed": changed,
                "applied": bool(apply and changed),
                "removed": result.get("removed") or [],
            }
        )
    return {
        "folder": str(folder_path),
        "file_count": len(files),
        "changed_count": changed_count,
        "applied": bool(apply),
        "files": [row for row in files if row["changed"]][:40],
    }


def main() -> int:
    parser = argparse.ArgumentParser(
        description="Sanitize kitchen taxonomy/brochure JSON (strip deep clearance-kit collection pollution)"
    )
    parser.add_argument("--taxonomy-file", default=None)
    parser.add_argument("--brochure-folder", default=None)
    parser.add_argument("--apply", action="store_true")
    args = parser.parse_args()
    if not args.taxonomy_file and not args.brochure_folder:
        parser.error("Provide --taxonomy-file and/or --brochure-folder")

    out: Dict[str, Any] = {"applied": bool(args.apply)}
    if args.taxonomy_file:
        out["taxonomy"] = rewrite_taxonomy_json(args.taxonomy_file, apply=args.apply)
    if args.brochure_folder:
        out["brochure"] = rewrite_brochure_folder(args.brochure_folder, apply=args.apply)
    print(json.dumps(out, indent=2, default=str))
    return 0


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