#!/usr/bin/env python3
"""Compare the served manifest for known-good 1.0.111 vs failing 1.0.113,
field by field, to find what's breaking UpdateFactory.getUpdate."""
import re, json, urllib.request

def get_manifest(runtime_version):
    url = "https://ota.46-4-121-190.sslip.io/api/manifest"
    req = urllib.request.Request(url, headers={
        "expo-platform": "android",
        "expo-project": "pixiesprout",
        "expo-channel-name": "default",
        "expo-runtime-version": runtime_version,
    })
    with urllib.request.urlopen(req, timeout=30) as resp:
        raw = resp.read().decode("utf-8", "replace")
    m = re.search(r'name="manifest"\r?\nContent-Type: application/json\r?\n\r?\n(\{.*?\})\r?\n', raw, re.S)
    if not m:
        m = re.search(r'name="manifest"\r?\n[^\n]*content-type: application/json[^\n]*\r?\n\r?\n(\{.*?\})\r?\n', raw, re.S)
    if not m:
        print(f"  [no manifest part found for {runtime_version}; body head: {raw[:150]!r}]")
        return None
    return json.loads(m.group(1))

a = get_manifest("1.0.111")   # known-good (phone accepted before)
b = get_manifest("1.0.113")   # failing

print("=== 1.0.111 (known-good) manifest ===")
if a:
    print("  top keys:", sorted(a.keys()))
    print("  id:", a.get("id"))
    print("  runtimeVersion:", a.get("runtimeVersion"))
    print("  extra keys:", sorted(a.get("extra", {}).keys()))
    ec = a.get("extra", {}).get("expoClient", {})
    print("  expoClient keys (%d):" % len(ec), sorted(ec.keys())[:25])
    print("  scopeKey:", repr(a.get("extra", {}).get("scopeKey")))
    print("  revisionId:", repr(ec.get("revisionId")))
    print("  createdAt:", a.get("createdAt"))
    print("  launchAsset:", json.dumps(a.get("launchAsset"))[:200])
print()
print("=== 1.0.113 (failing) manifest ===")
if b:
    print("  top keys:", sorted(b.keys()))
    print("  id:", b.get("id"))
    print("  runtimeVersion:", b.get("runtimeVersion"))
    print("  extra keys:", sorted(b.get("extra", {}).keys()))
    ecb = b.get("extra", {}).get("expoClient", {})
    print("  expoClient keys (%d):" % len(ecb), sorted(ecb.keys())[:25])
    print("  scopeKey:", repr(b.get("extra", {}).get("scopeKey")))
    print("  revisionId:", repr(ecb.get("revisionId")))
    print("  createdAt:", b.get("createdAt"))
    print("  launchAsset:", json.dumps(b.get("launchAsset"))[:200])

print()
print("=== DIFF (what 1.0.113 is missing or differs) ===")
if a and b:
    for k in sorted(set(a.keys()) | set(b.keys())):
        if a.get(k) != b.get(k):
            print(f"  top[{k}]:\n    111={str(a.get(k))[:120]}\n    113={str(b.get(k))[:120]}")
    # extra.expoClient top-level fields
    ea, eb = a.get("extra", {}), b.get("extra", {})
    for k in sorted(set(ea.keys()) | set(eb.keys())):
        if ea.get(k) != eb.get(k):
            print(f"  extra[{k}]:\n    111={str(ea.get(k))[:120]}\n    113={str(eb.get(k))[:120]}")
