"""합성 웹 성능 이벤트를 ClickHouse에 보낸다. 표준 라이브러리만 쓴다.

    python3 send_events.py --count 2400 --rps 200
    python3 send_events.py --count 2400 --rps 200 --degraded   # /item만 느려진다
"""
import argparse
import json
import random
import time
import urllib.parse
import urllib.request
import uuid
from datetime import datetime, timezone

URL = "http://localhost:8123/"
AUTH = {"X-ClickHouse-User": "demo", "X-ClickHouse-Key": "demo"}
PAGES = ["/home", "/search", "/item"]


def event(degraded):
    page = random.choice(PAGES)
    slow = degraded and page == "/item"
    if random.random() < 0.5:
        metric, value = "LCP", random.gauss(3200 if slow else 1600, 400)
    else:
        metric, value = "INP", random.gauss(350 if slow else 120, 40)
    return {
        "event_id": str(uuid.uuid4()),
        "event_time": datetime.now(timezone.utc).strftime("%Y-%m-%d %H:%M:%S.%f")[:-3],
        "metric": metric,
        "page": page,
        "value": max(value, 1.0),
    }


def insert(rows):
    query = "INSERT INTO web_perf_raw FORMAT JSONEachRow"
    params = urllib.parse.urlencode({
        "query": query,
        "async_insert": 1,
        "wait_for_async_insert": 1,
        "date_time_input_format": "best_effort",
    })
    body = "\n".join(json.dumps(r) for r in rows).encode()
    req = urllib.request.Request(URL + "?" + params, data=body, headers=AUTH)
    urllib.request.urlopen(req).read()


def main():
    p = argparse.ArgumentParser()
    p.add_argument("--count", type=int, default=2400)
    p.add_argument("--rps", type=int, default=200)
    p.add_argument("--degraded", action="store_true")
    a = p.parse_args()
    sent = 0
    while sent < a.count:
        started = time.time()
        batch = [event(a.degraded) for _ in range(min(a.rps, a.count - sent))]
        insert(batch)
        sent += len(batch)
        print(f"sent {sent}/{a.count}", flush=True)
        time.sleep(max(0.0, 1.0 - (time.time() - started)))


if __name__ == "__main__":
    main()
