"""Summarize one CSV member in a completed, trusted tar.gz. Python 3.9+."""
import argparse
import csv
import io
import json
import sys
import tarfile
import zlib


def summarize(path, member, max_bytes):
    with tarfile.open(path, "r:gz") as archive:
        matches = [item for item in archive.getmembers() if item.name == member]
        if not matches:
            raise ValueError(f"member not found: {member!r}")
        if len(matches) != 1:
            raise ValueError(f"duplicate member: {member!r}")
        info = matches[0]
        if not info.isfile():
            raise ValueError(f"member is not a regular file: {member!r}")
        if info.size > max_bytes:
            raise ValueError(f"member size {info.size} exceeds limit {max_bytes}")
        records = total = 0
        with archive.extractfile(info) as raw:
            with io.TextIOWrapper(raw, encoding="utf-8-sig", newline="") as text:
                reader = csv.reader(text, strict=True)
                if next(reader, None) != ["id", "value"]:
                    raise ValueError("expected header: id,value")
                for row in reader:
                    where = f"physical line {reader.line_num}"
                    if len(row) != 2 or not row[0].strip():
                        raise ValueError(f"{where}: expected nonempty id and value")
                    try:
                        value = int(row[1])
                    except ValueError as exc:
                        raise ValueError(f"{where}: value must be an integer") from exc
                    records += 1
                    total += value
    return {"member": member, "records": records, "total": total}


def main():
    parser = argparse.ArgumentParser(description=__doc__, allow_abbrev=False)
    parser.add_argument("archive", help="completed local tar.gz")
    parser.add_argument("member", help="exact member name, as listed by tarfile")
    parser.add_argument("--max-bytes", type=int, default=64 * 1024 * 1024,
                        help="maximum declared CSV size; default: 67108864")
    args = parser.parse_args()
    if args.max_bytes <= 0:
        parser.error("--max-bytes must be positive")
    try:
        result = summarize(args.archive, args.member, args.max_bytes)
    except (OSError, EOFError, tarfile.TarError, zlib.error,
            UnicodeError, csv.Error, ValueError) as exc:
        print(f"ERROR: {exc}", file=sys.stderr)
        return 1
    print(json.dumps(result, ensure_ascii=False))
    return 0


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