"""Query a fixed demo schema with bound, limit-aware IN batches. Python 3.11+."""
import argparse
from contextlib import closing
import json
import sqlite3
import sys


def positive_int(text):
    value = int(text)
    if value < 1:
        raise argparse.ArgumentTypeError("must be a positive integer")
    return value


def find_jobs(con, names, status="ready", batch_size=500):
    if batch_size < 1:
        raise ValueError("batch_size must be positive")
    names = list(names)
    if any(not isinstance(name, str) for name in names):
        raise ValueError("names must contain only strings")
    unique = list(dict.fromkeys(names))
    if not unique:
        return []
    # One parameter is reserved for status in every SELECT.
    available = con.getlimit(sqlite3.SQLITE_LIMIT_VARIABLE_NUMBER) - 1
    if available < 1:
        raise ValueError("variable limit leaves no room for names")
    size = min(batch_size, available)
    rows = []
    for start in range(0, len(unique), size):
        batch = unique[start:start + size]
        marks = ",".join("?" for _ in batch)
        sql = "SELECT name, status FROM jobs WHERE status = ? AND name IN (" + marks + ")"
        with closing(con.execute(sql, [status, *batch])) as cur:
            rows.extend({"name": name, "status": state} for name, state in cur)
    return sorted(rows, key=lambda row: row["name"])


def demo_connection():
    con = sqlite3.connect(":memory:", isolation_level=None)
    try:
        con.execute("CREATE TABLE jobs(name TEXT PRIMARY KEY NOT NULL, status TEXT NOT NULL)")
        con.executemany("INSERT INTO jobs VALUES (?, ?)", [
            ("alpha", "ready"), ("beta", "done"),
            ("gamma", "ready"), ("o'reilly", "ready"),
        ])
    except BaseException:
        con.close()
        raise
    return con


def main(argv=None):
    parser = argparse.ArgumentParser(description=__doc__, allow_abbrev=False)
    parser.add_argument("names", nargs="*", help="exact names; no names returns []")
    parser.add_argument("--status", choices=["ready", "done"], default="ready")
    parser.add_argument("--batch-size", type=positive_int, default=500)
    args = parser.parse_args(argv)
    try:
        with closing(demo_connection()) as con:
            rows = find_jobs(con, args.names, args.status, args.batch_size)
    except (sqlite3.Error, ValueError) as exc:
        print(f"ERROR: {exc}", file=sys.stderr)
        return 1
    print(json.dumps(rows, ensure_ascii=False, sort_keys=True))
    return 0


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