"""
CV6 AI Trading OS — CPU/RAM Probe
Measures ACTUAL psutil CPU and RAM while running API calls.
"""
import time
import json
import psutil
import requests

BASE = "http://127.0.0.1:8000"
EMAIL    = "psasi144@gmail.com"
PASSWORD = "CV6Tr@d3r2026!"

print("="*50)
print("CV6 RESOURCE MONITOR — psutil installed")
print("="*50)

# ── Verify psutil ──────────────────────────────────────
print(f"\npsutil version: {psutil.__version__}")
proc = psutil.Process()

# ── Baseline before any load ──────────────────────────
time.sleep(1)
baseline_cpu  = psutil.cpu_percent(interval=2)  # 2-second sample
baseline_ram  = psutil.virtual_memory()
baseline_proc_ram = proc.memory_info().rss / 1024 / 1024

print(f"\nBaseline (no load):")
print(f"  System CPU:  {baseline_cpu:.1f}%")
print(f"  System RAM:  {baseline_ram.percent:.1f}% used ({baseline_ram.used//1024//1024} MB / {baseline_ram.total//1024//1024} MB)")
print(f"  Python proc: {baseline_proc_ram:.1f} MB RSS")

# ── Login ──────────────────────────────────────────────
r = requests.post(f"{BASE}/users/login", json={"email": EMAIL, "password": PASSWORD})
if r.status_code != 200:
    print(f"\nFATAL: Login failed: {r.status_code} {r.json()}")
    exit(1)
token = r.json()["access_token"]
hdrs  = {"Authorization": f"Bearer {token}"}
print(f"\nLogin OK")

# ── Run 50 API calls while sampling CPU/RAM ────────────
print("\nRunning 50 API calls (measuring CPU/RAM during load)...")
cpu_samples = []
ram_samples = []

endpoints = [
    ("/dashboard/",        "GET",  None),
    ("/dashboard/pnl",     "GET",  None),
    ("/dashboard/funds",   "GET",  None),
    ("/dashboard/risk",    "GET",  None),
    ("/paper/account",     "GET",  None),
    ("/paper/history",     "GET",  None),
    ("/history/",          "GET",  None),
    ("/history/pnl",       "GET",  None),
    ("/ws/status",         "GET",  None),
    ("/paper/trade",       "POST", {"symbol":"NIFTY","action":"BUY","quantity":1,"entry_price":24000,"capital":100000}),
]

for i in range(50):
    ep = endpoints[i % len(endpoints)]
    path, method, body = ep
    t0 = time.time()
    if method == "GET":
        requests.get(f"{BASE}{path}", headers=hdrs, timeout=5)
    else:
        requests.post(f"{BASE}{path}", json=body, headers=hdrs, timeout=5)

    # Sample every 5 calls
    if i % 5 == 0:
        cpu_s = psutil.cpu_percent(interval=0.5)
        ram_s = psutil.virtual_memory().percent
        cpu_samples.append(cpu_s)
        ram_samples.append(ram_s)
        print(f"  [{i:2d}/50] CPU={cpu_s:.1f}% RAM={ram_s:.1f}%")

# ── Peak values ───────────────────────────────────────
peak_cpu = max(cpu_samples) if cpu_samples else 0
avg_cpu  = sum(cpu_samples)/len(cpu_samples) if cpu_samples else 0
peak_ram = max(ram_samples) if ram_samples else 0
avg_ram  = sum(ram_samples)/len(ram_samples) if ram_samples else 0

proc_ram_after = proc.memory_info().rss / 1024 / 1024

print(f"\n{'='*50}")
print(f"RESOURCE MEASUREMENT RESULTS (ACTUAL)")
print(f"{'='*50}")
print(f"Baseline CPU:   {baseline_cpu:.1f}%")
print(f"Under-load CPU: avg={avg_cpu:.1f}% peak={peak_cpu:.1f}%")
print(f"Baseline RAM:   {baseline_ram.percent:.1f}%")
print(f"Under-load RAM: avg={avg_ram:.1f}% peak={peak_ram:.1f}%")
print(f"Python proc:    before={baseline_proc_ram:.1f} MB  after={proc_ram_after:.1f} MB")
print(f"Total system:   {baseline_ram.total//1024//1024} MB")
print(f"{'='*50}")

# ── Save results ──────────────────────────────────────
results = {
    "timestamp": time.strftime("%Y-%m-%dT%H:%M:%S"),
    "psutil_version": psutil.__version__,
    "baseline_cpu_pct": baseline_cpu,
    "load_cpu_avg_pct": round(avg_cpu, 1),
    "load_cpu_peak_pct": round(peak_cpu, 1),
    "baseline_ram_pct": baseline_ram.percent,
    "load_ram_avg_pct": round(avg_ram, 1),
    "load_ram_peak_pct": round(peak_ram, 1),
    "python_proc_ram_mb_before": round(baseline_proc_ram, 1),
    "python_proc_ram_mb_after": round(proc_ram_after, 1),
    "system_total_ram_mb": baseline_ram.total // 1024 // 1024,
    "samples": [{"cpu": c, "ram": r} for c, r in zip(cpu_samples, ram_samples)],
}

with open("resource_results.json", "w") as f:
    json.dump(results, f, indent=2)

print(f"\nSaved to resource_results.json")
