#!/usr/bin/env python3
"""Run deterministic analytics examples in clickhouse-local, never a server."""
import argparse
import datetime
import hashlib
import json
import pathlib
import platform
import subprocess
import sys
import tempfile

ROOT = pathlib.Path(__file__).resolve().parent
EXPECTED = {
    "funnel.sql": "u1\t3\nu2\t1\nu3\t1\n",
    "retention.sql": "2026-09-01\t2\t2\t1\t100\t50\n2026-09-02\t1\t0\t0\t0\t0\n",
    "funnel-edge-cases.sql": "boundary\t3\nduplicate\t3\noutside\t2\nunordered_input\t3\nwrong_order\t1\n",
    "funnel-strict.sql": "equal_time\t1\nincreasing\t3\n",
    "retention-edge-cases.sql": "2026-09-01\t2\t1\t1\n2026-09-08\t1\t1\t\\N\n",
}

def run(binary, query):
    with tempfile.TemporaryDirectory(prefix="sensorflow-sql-") as directory:
        return subprocess.run([binary, "local", "--path", directory,
                               "--output_format_pretty_color=0", "--query", query],
                              capture_output=True, text=True, timeout=60)

def main():
    parser = argparse.ArgumentParser(description=__doc__)
    parser.add_argument("--clickhouse", default="clickhouse")
    parser.add_argument("--out", type=pathlib.Path)
    args = parser.parse_args()
    version = run(args.clickhouse, "SELECT version()")
    if version.returncode:
        sys.exit(version.stderr)
    results = []
    for name, expected in EXPECTED.items():
        query = (ROOT / name).read_text()
        result = run(args.clickhouse, query)
        passed = result.returncode == 0 and result.stdout == expected
        results.append({"file": name, "passed": passed,
                        "sha256": hashlib.sha256(query.encode()).hexdigest(),
                        "expected": expected, "actual": result.stdout,
                        "error": result.stderr if result.returncode else ""})
        print(("PASS " if passed else "FAIL ") + name)
    report = {"measured_at": datetime.datetime.now(datetime.timezone.utc).isoformat(),
              "clickhouse_version": version.stdout.strip(), "os": platform.system(),
              "architecture": platform.machine(), "scope": "synthetic SQL semantics only; no SDK ingestion or throughput claim",
              "results": results}
    if args.out:
        args.out.write_text(json.dumps(report, ensure_ascii=False, indent=2) + "\n")
    return 0 if all(x["passed"] for x in results) else 1

if __name__ == "__main__":
    sys.exit(main())
