#!/usr/bin/env python3
"""Pull missing pieces: retry SMS metrics + list/segment sizes + Open/Click metrics."""
import os, sys, json, time, requests
KEY = os.environ.get("KLAVIYO_KEY") or sys.argv[1]
H = {
    "Authorization": f"Klaviyo-API-Key {KEY}",
    "accept": "application/vnd.api+json",
    "revision": "2024-10-15",
    "content-type": "application/vnd.api+json",
}
OUT = "/home/sol1/Desktop/MARKETING/nitrous_3mo/klaviyo"

# ---- SMS metrics retry (smaller batches, slow) ----
sms_campaigns = json.load(open(f"{OUT}/sms_campaigns.json"))
sms_ids = [c["id"] for c in sms_campaigns]
metrics = json.load(open(f"{OUT}/metrics.json"))
po_id = next((m["id"] for m in metrics if (m.get("attributes",{}).get("name") or "").lower()=="placed order"), None)
print(f"Placed Order metric: {po_id}; SMS to fetch: {len(sms_ids)}")

batches = []
for i in range(0, len(sms_ids), 25):
    chunk = sms_ids[i:i+25]
    body = {"data":{"type":"campaign-values-report","attributes":{
        "statistics": ["recipients","clicks","clicks_unique","click_rate","conversions","conversion_uniques","conversion_value","conversion_rate","delivered","delivery_rate","unsubscribes","unsubscribe_rate","spam_complaints","bounced","bounce_rate","revenue_per_recipient"],
        "timeframe": {"key": "last_90_days"},
        "filter": f"contains-any(campaign_id,[{','.join(repr(c) for c in chunk)}])",
        "conversion_metric_id": po_id,
    }}}
    for attempt in range(8):
        r = requests.post("https://a.klaviyo.com/api/campaign-values-reports/", headers=H, json=body, timeout=60)
        if r.status_code in (200,207):
            batches.append(r.json()); print(f"  batch {i//25} ok ({len(chunk)} rows)"); break
        if r.status_code == 429:
            wait = 5 + attempt*5
            print(f"  429, sleeping {wait}s...")
            time.sleep(wait); continue
        print(f"  ERR {r.status_code}: {r.text[:200]}"); break
    time.sleep(3)

with open(f"{OUT}/sms_campaign_metrics.json","w") as f: json.dump(batches, f)
print(f"Saved {len(batches)} SMS metric batches")

# ---- List sizes ----
print("Fetching list profile counts...")
lists = json.load(open(f"{OUT}/lists.json"))
list_sizes = []
for L in lists:
    lid = L["id"]
    nm = L.get("attributes",{}).get("name")
    # Sleep to avoid rate limits
    for attempt in range(4):
        r = requests.get(f"https://a.klaviyo.com/api/lists/{lid}/profiles", headers=H, params={"page[size]": 1, "additional-fields[profile]":"subscriptions"}, timeout=30)
        if r.status_code == 200:
            d = r.json()
            # Total count is not directly available; use the count-only endpoint via /relationships
            total = None
            # try the profile-count endpoint
            r2 = requests.get(f"https://a.klaviyo.com/api/lists/{lid}", headers=H, params={"additional-fields[list]": "profile_count"}, timeout=30)
            if r2.status_code == 200:
                total = r2.json().get("data",{}).get("attributes",{}).get("profile_count")
            list_sizes.append({"id": lid, "name": nm, "profile_count": total})
            print(f"  {nm}: {total}")
            break
        if r.status_code == 429:
            time.sleep(5+attempt*5); continue
        break
    time.sleep(1)
with open(f"{OUT}/list_sizes.json","w") as f: json.dump(list_sizes, f)
print(f"Saved {len(list_sizes)} list sizes")
