"""Bundled JSON formatter (dazedformat).

Normalises all .json files in a directory tree by round-tripping them
through json.load / json.dump with indent=4, which ensures consistent
formatting before importing into files/.
"""
from __future__ import annotations

import json
import os
from pathlib import Path
from typing import Callable


def format_json_files(
    directory: str | Path,
    log: Callable[[str], None] | None = None,
) -> tuple[int, list[str]]:
    """Format every .json file found under *directory* in-place.

    Returns (formatted_count, error_list).
    """
    directory = Path(directory)
    formatted = 0
    errors: list[str] = []

    for root, _, files in os.walk(directory):
        for name in files:
            if not name.lower().endswith(".json"):
                continue
            fp = Path(root) / name
            try:
                text = fp.read_text(encoding="utf-8")
                data = json.loads(text)
                pretty = json.dumps(data, indent=4, ensure_ascii=False)
                # Only write if the content actually changed
                if pretty != text:
                    fp.write_text(pretty, encoding="utf-8")
                formatted += 1
                if log:
                    log(f"  Formatted: {fp.relative_to(directory)}")
            except Exception as exc:
                msg = f"Error in {fp}: {exc}"
                errors.append(msg)
                if log:
                    log(f"  ⚠  {msg}")

    return formatted, errors
