"""Finish the current JSONL record before stopping. Linux, Python 3.10+."""
import argparse
import json
import math
import os
from pathlib import Path
import signal
import sys
import time

stop_signal = None


def request_stop(signum, frame):
    global stop_signal
    if stop_signal is None:
        stop_signal = signum


def main():
    parser = argparse.ArgumentParser(description=__doc__)
    parser.add_argument("output", type=Path, help="new JSONL output path")
    parser.add_argument("--items", type=int, default=10)
    parser.add_argument("--delay", type=float, default=1.0,
                        help="demo work seconds per item (0 to 60)")
    args = parser.parse_args()
    if args.items < 1:
        parser.error("--items must be positive")
    if not math.isfinite(args.delay) or not 0 <= args.delay <= 60:
        parser.error("--delay must be finite and between 0 and 60")

    signal.signal(signal.SIGTERM, request_stop)
    signal.signal(signal.SIGINT, request_stop)
    completed = 0
    try:
        with args.output.open("x", encoding="utf-8") as output:
            for item in range(1, args.items + 1):
                if stop_signal is not None:
                    break
                print(f"START item={item}", flush=True)
                time.sleep(args.delay)  # Replace with bounded, synchronous work.
                record = {"id": item, "square": item * item}
                output.write(json.dumps(record) + "\n")
                output.flush()
                os.fsync(output.fileno())
                completed += 1
                print(f"SAVED item={item}", flush=True)
    except OSError as exc:
        print(f"ERROR: {exc}", file=sys.stderr)
        return 1

    if stop_signal is not None:
        name = signal.Signals(stop_signal).name
        print(f"STOPPED signal={name} completed={completed}", flush=True)
        return 128 + stop_signal
    print(f"DONE completed={completed}", flush=True)
    return 0


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