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

EMAIL = "gautam@exulthealthcare.com"
PASSWORD = "jiwqij-4vorpe-tyvJaf"

out = open("/tmp/curo/04.out", "w")
def log(*a):
    print(*a, file=out); out.flush()

t = cdp.find_target(url_sub="curogram.com") or cdp.find_target(want_blank=True)
log("target:", t.get("id"), t.get("url"))
p = cdp.attach(t)
p.enable()

# Ensure we're on the login page
cur = p.eval("location.href")
if "login" not in (cur or ""):
    p.navigate("https://app.curogram.com")
    time.sleep(7)
log("url before fill:", p.eval("location.href"))

# Angular-safe setter
setter = r"""
(function(email, password){
  function setVal(el, val){
    var proto = el.tagName === 'TEXTAREA' ? window.HTMLTextAreaElement.prototype : window.HTMLInputElement.prototype;
    var nativeSetter = Object.getOwnPropertyDescriptor(proto, 'value').set;
    el.focus();
    nativeSetter.call(el, val);
    el.dispatchEvent(new Event('input', {bubbles:true}));
    el.dispatchEvent(new Event('change', {bubbles:true}));
    el.dispatchEvent(new Event('blur', {bubbles:true}));
  }
  var emailEl = document.querySelector('input[formcontrolname=email]')
             || document.querySelector('input[placeholder="Email address"]')
             || document.querySelector('input[type=text]');
  var passEl = document.querySelector('input[type=password]');
  if(!emailEl || !passEl){ return JSON.stringify({ok:false, email:!!emailEl, pass:!!passEl}); }
  setVal(emailEl, email);
  setVal(passEl, password);
  return JSON.stringify({ok:true, emailVal:emailEl.value, passLen:passEl.value.length});
})
"""
res = p.eval(setter + "(%s,%s)" % (json.dumps(EMAIL), json.dumps(PASSWORD)))
log("fill result:", res)

time.sleep(1)
# Check submit button state
btnstate = p.eval(r"""
(function(){
  var btns = Array.from(document.querySelectorAll('button'));
  var b = btns.find(function(x){return (x.innerText||'').trim().toLowerCase()==='sign in';});
  return JSON.stringify({found:!!b, disabled: b? b.disabled : null});
})()
""")
log("button state:", btnstate)

p.screenshot("/tmp/curo/04-filled.png")
log("screenshot filled saved")

# Click Sign In
click = p.eval(r"""
(function(){
  var btns = Array.from(document.querySelectorAll('button'));
  var b = btns.find(function(x){return (x.innerText||'').trim().toLowerCase()==='sign in';});
  if(!b) return 'no-button';
  b.click();
  return 'clicked';
})()
""")
log("click:", click)

# Wait for navigation / MFA screen
for i in range(20):
    time.sleep(1.5)
    u = p.eval("location.href")
    body = p.eval("document.body ? document.body.innerText.slice(0,400) : ''")
    if i % 3 == 0:
        log("poll", i, "url:", u)
    # detect mfa keywords
    low = (body or "").lower()
    if any(k in low for k in ["code", "verification", "otp", "we sent", "enter the", "authentication"]):
        log("possible MFA screen at poll", i)
        log("body snippet:", json.dumps(body[:400]))
        break
    if "/login" not in (u or ""):
        log("navigated away from login at poll", i, "->", u)
        break

log("final url:", p.eval("location.href"))
log("final title:", p.eval("document.title"))
log("body snippet:", json.dumps((p.eval("document.body ? document.body.innerText.slice(0,600):''") or "")))
# enumerate any new inputs (OTP field)
log("inputs now:", p.eval(r"""JSON.stringify(Array.from(document.querySelectorAll('input')).map(function(el){return {type:el.type,placeholder:el.placeholder,formcontrolname:el.getAttribute('formcontrolname'),maxlength:el.maxLength};}))"""))
p.screenshot("/tmp/curo/04-postsubmit.png")
log("DONE-04")
p.close()
out.close()
