"""Summarize regular *.txt files without expanding filenames into argv."""
import argparse
import errno
import json
import os
from pathlib import Path
import stat
import sys


def stop_walk(error):
    raise error


def summarize(directory):
    root = Path(directory).resolve(strict=True)
    if not root.is_dir():
        raise NotADirectoryError(errno.ENOTDIR, "not a directory", str(root))
    files = total = 0
    for parent, _, names in os.walk(root, followlinks=False, onerror=stop_walk):
        for name in names:
            if not name.endswith(".txt"):
                continue
            info = (Path(parent) / name).lstat()
            if stat.S_ISREG(info.st_mode):
                files += 1
                total += info.st_size
    return {"files": files, "bytes": total}


def main():
    parser = argparse.ArgumentParser(description=__doc__)
    parser.add_argument("directory", type=Path)
    args = parser.parse_args()
    try:
        report = summarize(args.directory)
    except OSError as exc:
        label = errno.errorcode.get(exc.errno, "OSERROR")
        print(f"ERROR {label}: {exc}", file=sys.stderr)
        return 1
    print(json.dumps(report, sort_keys=True))
    return 0


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