import hashlib
import json
import os
import time
from datetime import datetime, timezone
from pathlib import Path
from uuid import uuid4
from openai import OpenAI


def main():
    prefix = Path("prefix.txt").read_text(encoding="utf-8")
    if not prefix.strip():
        raise ValueError("prefix.txt must contain your unchanged instructions/reference text")
    prefix_hash = hashlib.sha256(prefix.encode()).hexdigest()
    client = OpenAI(api_key=os.environ["QUICKROUTER_API_KEY"],
                    base_url="https://api.quickrouter.ai/v1", timeout=60, max_retries=0)
    records = []
    output = Path("cache-observations-" + uuid4().hex + ".json")

    def save():
        temporary = output.with_suffix(".tmp")
        temporary.write_text(json.dumps(records, ensure_ascii=False, indent=2), encoding="utf-8")
        temporary.replace(output)

    print("records:", output)
    for index, question in enumerate(["总结三条核心规则。", "针对第一条规则给一个例子。", "总结三条核心规则。"], 1):
        started = time.perf_counter()
        record = {"attempt": index, "model": os.environ["QUICKROUTER_MODEL"],
                  "prefix_sha256": prefix_hash, "status": "unknown",
                  "started_at": datetime.now(timezone.utc).isoformat(), "usage": None}
        records.append(record)
        save()
        try:
            result = client.chat.completions.create(
                model=os.environ["QUICKROUTER_MODEL"],
                messages=[{"role": "system", "content": prefix}, {"role": "user", "content": question}])
        except Exception as error:
            record.update(error_type=type(error).__name__, elapsed_seconds=round(time.perf_counter() - started, 3))
            save()
            raise RuntimeError("Request outcome unknown; inspect records and console before resubmitting") from None
        usage = result.usage.model_dump() if result.usage else None
        details = (usage or {}).get("prompt_tokens_details") or {}
        choice = result.choices[0] if result.choices else None
        valid = choice is not None and choice.finish_reason == "stop" and bool(choice.message.content)
        record.update(status="accepted" if valid else "invalid", request_id=getattr(result, "_request_id", None),
                      elapsed_seconds=round(time.perf_counter() - started, 3),
                      finish_reason=choice.finish_reason if choice else None,
                      cached_tokens=details.get("cached_tokens"),
                      cache_write_tokens=details.get("cache_write_tokens"), usage=usage)
        save()
        if not valid:
            raise RuntimeError("Empty or incomplete output; inspect saved usage before another request")
    print(json.dumps(records, indent=2))


if __name__ == "__main__":
    main()
