"""Count lines in a completed gzip log; emit JSON only after a full read."""
import argparse
import gzip
import json
from pathlib import Path
import sys
import zlib


def summarize(path, contains, encoding):
    lines = matches = 0
    with path.open("rb") as raw:
        if raw.read(2) != b"\x1f\x8b":
            raise gzip.BadGzipFile("missing gzip header")
        raw.seek(0)
        with gzip.open(raw, "rt", encoding=encoding, errors="strict") as stream:
            for line in stream:
                lines += 1
                if contains is None or contains in line:
                    matches += 1
    return {"file": str(path), "lines": lines, "matches": matches}


def main():
    parser = argparse.ArgumentParser(description=__doc__, allow_abbrev=False)
    parser.add_argument("file", type=Path, help="completed .gz text log")
    parser.add_argument("--contains", help="case-sensitive literal substring")
    parser.add_argument("--encoding", default="utf-8", help="text encoding (default: utf-8)")
    args = parser.parse_args()
    if args.contains == "":
        parser.error("contains must not be empty")
    try:
        result = summarize(args.file, args.contains, args.encoding)
    except (OSError, EOFError, zlib.error, UnicodeError, LookupError) as exc:
        print(f"ERROR: {args.file}: {exc}", file=sys.stderr)
        return 1
    print(json.dumps(result, ensure_ascii=False))
    return 0


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