import sys, time, json
sys.path.insert(0, "/tmp/amdwork")
import cdp

_outf = open("/tmp/amdwork/changepw2.out", "w")
def log(*a):
    s = " ".join(str(x) for x in a)
    print(s)
    _outf.write(s + "\n"); _outf.flush()

OLD = open("/home/claude/.config/amd-agent/credentials.env").read()
old_pw = None; user = None; office = None
for line in OLD.splitlines():
    if line.startswith("AMD_PASSWORD="): old_pw = line.split("=",1)[1]
    if line.startswith("AMD_USER="): user = line.split("=",1)[1]
    if line.startswith("AMD_OFFICE="): office = line.split("=",1)[1]
new_pw = open("/tmp/amd-agent-newpassword.txt").read().strip()

# sanity (no value logging)
log("old_pw len:", len(old_pw or ""))
log("new_pw len:", len(new_pw or ""))
log("new contains 'agent' (lower):", ("agent" in (new_pw or "").lower()))

target = cdp.find_target("change-password") or cdp.find_target("advancedmd")
if not target:
    log("NO TARGET"); sys.exit(1)
pg = cdp.attach(target)
pg.enable()
log("URL:", pg.eval("location.href"))

def set_field(field_id, value):
    expr = """(function(){
      var el = document.getElementById(%s);
      if(!el) return 'NOELEM';
      var proto = Object.getPrototypeOf(el);
      var desc = Object.getOwnPropertyDescriptor(proto, 'value') || Object.getOwnPropertyDescriptor(HTMLInputElement.prototype, 'value');
      el.focus();
      if(desc && desc.set){ desc.set.call(el, %s); } else { el.value = %s; }
      el.dispatchEvent(new Event('input', {bubbles:true}));
      el.dispatchEvent(new Event('change', {bubbles:true}));
      el.dispatchEvent(new KeyboardEvent('keyup', {bubbles:true}));
      el.blur();
      return el.value.length;
    })()""" % (json.dumps(field_id), json.dumps(value), json.dumps(value))
    return pg.eval(expr)

uval = pg.eval("(document.getElementById('username')||{}).value || ''")
log("username currently len:", len(uval or ""))
if not uval:
    log("setting username ->", set_field("username", user))

log("set oldPassword len:", set_field("oldPassword", old_pw))
log("set newPassword len:", set_field("newPassword", new_pw))
log("set confirmPassword len:", set_field("confirmPassword", new_pw))
log("verify old len:", pg.eval("document.getElementById('oldPassword').value.length"))
log("verify new len:", pg.eval("document.getElementById('newPassword').value.length"))
log("verify confirm len:", pg.eval("document.getElementById('confirmPassword').value.length"))
log("btn disabled?:", pg.eval("(document.getElementById('btnSubmit')||{}).disabled"))

clicked = pg.eval("(function(){var b=document.getElementById('btnSubmit'); if(!b) return 'NOBTN'; b.click(); return 'CLICKED';})()")
log("click:", clicked)

# poll up to 12s for URL change / error
deadline = time.time() + 12
final_url = None; body = None
while time.time() < deadline:
    time.sleep(2)
    final_url = pg.eval("location.href")
    body = (pg.eval("document.body.innerText") or "")
    if "change-password" not in (final_url or ""):
        break
    if "valid password" in body.lower() or "rules as indicated" in body.lower():
        # still may be error; keep last
        pass

log("after URL:", final_url)
log("after title:", pg.eval("document.title"))
log("after bodytext:", (body or "")[:900])
pg.screenshot("/tmp/amdwork/after-changepw2.png")

accepted = "change-password" not in (final_url or "")
rule_err = ("valid password" in (body or "").lower()) or ("rules as indicated" in (body or "").lower())
log("RESULT accepted:", accepted, "rule_err_present:", rule_err)
log("DONE")
pg.close()
