#!/usr/bin/env python3
"""Set the Curogram password using the CORRECT change-password token decoded from
the Mandrill payload. Clean single keystroke fill + submit + network capture.
Never prints the password."""
import sys, json, time
sys.path.insert(0, "/home/claude/repos/openclaw/.claude/skills/advancedmd/scripts")
import amd_browser as A

CHPWD = "https://app.curogram.com/change-password/CHPWD-4656c006-fe77-4717-8d08-a067a51602c6"
CREDS = "/home/claude/.config/amd-agent/credentials.env"
def get_pw():
    with open(CREDS) as f:
        for ln in f:
            if ln.startswith("CUROGRAM_AGENT_PASSWORD="):
                return ln.split("=",1)[1].strip()
    raise SystemExit("NO_PW")

t = A.find_target(url_sub="curogram.com")
pg = A.attach(t); pg.enable()
pw = get_pw()
A.goto(pg, CHPWD, settle=4)
print("URL:", pg.eval("location.href"))
pg.send("Network.enable")

def type_field(idx):
    pos = pg.eval(
      "(()=>{const ps=[...document.querySelectorAll('input[type=password]')];"
      "if(ps.length<=%d) return null; const el=ps[%d]; el.focus();"
      "const s=Object.getOwnPropertyDescriptor(window.HTMLInputElement.prototype,'value').set;"
      "s.call(el,'');el.dispatchEvent(new Event('input',{bubbles:true}));"
      "const r=el.getBoundingClientRect();return JSON.stringify({x:r.left+r.width/2,y:r.top+r.height/2});})()" % (idx,idx))
    if not pos: return False
    c=json.loads(pos)
    pg.send("Input.dispatchMouseEvent",{"type":"mousePressed","x":c["x"],"y":c["y"],"button":"left","clickCount":1})
    pg.send("Input.dispatchMouseEvent",{"type":"mouseReleased","x":c["x"],"y":c["y"],"button":"left","clickCount":1})
    time.sleep(0.15)
    pg.send("Input.insertText",{"text":pw})
    pg.eval("(()=>{const ps=[...document.querySelectorAll('input[type=password]')];ps[%d].dispatchEvent(new Event('blur',{bubbles:true}));return 1;})()" % idx)
    return True

type_field(0); type_field(1)
time.sleep(0.3)
lens = json.loads(pg.eval("JSON.stringify([...document.querySelectorAll('input[type=password]')].map(p=>p.value.length))"))
print("VALUE_LENS:", lens, "EXPECTED:", len(pw))

# drain buffered events
pg.ws.settimeout(0.2)
try:
    while True: pg.ws.recv()
except Exception: pass

pg.eval("(()=>{const b=[...document.querySelectorAll('button')].find(x=>/submit/i.test(x.innerText));b&&b.click();return 1;})()")

req_ids={}; results=[]
deadline=time.time()+7; pg.ws.settimeout(1.0)
while time.time()<deadline:
    try: msg=json.loads(pg.ws.recv())
    except Exception: continue
    m=msg.get("method"); p=msg.get("params",{})
    if m=="Network.responseReceived":
        url=p.get("response",{}).get("url","")
        if "curogram.com/graphql" in url or "change-password" in url:
            req_ids[p.get("requestId")]=(url,p.get("response",{}).get("status"))
    if m=="Network.loadingFinished":
        rid=p.get("requestId")
        if rid in req_ids:
            url,status=req_ids[rid]
            try:
                body=pg.send("Network.getResponseBody",{"requestId":rid},timeout=5)
                txt=body.get("body","")[:300]
            except Exception as e:
                txt="(no body: %s)" % str(e)[:60]
            results.append((status,url[:70],txt))

out = "RESULTS:\n"+json.dumps(results,indent=1)[:1500]+"\nURL_NOW: "+str(pg.eval("location.href"))
print(out)
with open("/tmp/amdwork/activate_fixed.out","w") as f: f.write(out+"\n")
pg.close()
