import sys, time, json, urllib.request, os
sys.path.insert(0, "/tmp/amdwork")
import cdp
LOG="/tmp/amdwork/rc_export_csv.log"
def log(*a):
    with open(LOG,"a") as f: f.write(" ".join(str(x) for x in a)+"\n")
open(LOG,"w").close()
def targets():
    return [t for t in json.loads(urllib.request.urlopen("http://localhost:9223/json",timeout=10).read()) if t.get("type")=="page"]

ver=json.loads(urllib.request.urlopen("http://localhost:9223/json/version",timeout=10).read())
import websocket
bws=websocket.create_connection(ver["webSocketDebuggerUrl"],timeout=30,max_size=None); _bid=[0]
def bsend(method,params=None):
    _bid[0]+=1; mid=_bid[0]
    bws.send(json.dumps({"id":mid,"method":method,"params":params or {}}))
    while True:
        m=json.loads(bws.recv())
        if m.get("id")==mid: return m
bsend("Browser.setDownloadBehavior",{"behavior":"allow","downloadPath":"/home/claude/amd-agent-downloads","eventsEnabled":True})

rc=None
for t in targets():
    if "/reportcenter/" in (t.get("url") or ""): rc=t; break
p=cdp.attach(rc); p.enable()
href=p.eval("location.href")
if "generatedReport" in (href or "") or "685#685" in (href or ""):
    p.navigate("https://static-100.advancedmd.com/practicemanager/reportcenter/#/main/ProvidersGroups/685")
    time.sleep(5)
log("url:", p.eval("location.href"))

DLDIR="/home/claude/amd-agent-downloads"
before_files=set(os.listdir(DLDIR))
log("files before:", json.dumps(sorted(before_files)))

# Select All providers
p.eval("""(function(){var b=Array.from(document.querySelectorAll('a,button,span')).find(function(e){return (e.innerText||'').trim()==='Select All';}); if(b)b.click();})()""")
time.sleep(1)

# Set export format select to CSV (option index 0) via Angular-friendly approach
fmt=p.eval("""(function(){
  var sel=document.querySelector('select.export-select') || Array.from(document.querySelectorAll('select')).find(function(s){return (s.getAttribute('ng-model')||'')==='report.selectedFormat';});
  if(!sel) return 'NOSEL';
  // CSV is option whose label contains CSV
  var idx=-1;
  for(var i=0;i<sel.options.length;i++){ if(/CSV/i.test(sel.options[i].text)){idx=i;break;} }
  if(idx<0) return 'NOCSVOPT';
  sel.selectedIndex=idx;
  sel.dispatchEvent(new Event('change',{bubbles:true}));
  sel.dispatchEvent(new Event('input',{bubbles:true}));
  // trigger angular if present
  if(window.angular){ try{ var ng=window.angular.element(sel); var s=ng.scope&&ng.scope(); if(s){ ng.triggerHandler('change'); s.$apply&&s.$apply(); } }catch(e){} }
  return 'selectedText='+sel.options[sel.selectedIndex].text;
})()""")
log("set format CSV:", fmt)
time.sleep(1)

# Enable Export on Run
eor=p.eval("""(function(){
  var lbl=Array.from(document.querySelectorAll('label,span,div')).find(function(e){return /Export on Run/i.test((e.innerText||'')) && e.children.length<=2;});
  if(!lbl) return 'NO_EOR';
  var cb=lbl.querySelector('input[type=checkbox]');
  if(!cb && lbl.previousElementSibling && lbl.previousElementSibling.type==='checkbox') cb=lbl.previousElementSibling;
  if(!cb){var forid=lbl.getAttribute('for'); if(forid) cb=document.getElementById(forid);}
  if(!cb && lbl.parentElement) cb=lbl.parentElement.querySelector('input[type=checkbox]');
  if(cb){ if(!cb.checked) cb.click(); return 'EOR checked='+cb.checked; }
  return 'EOR no-checkbox';
})()""")
log("export on run:", eor)
time.sleep(1)

# verify selected format right before run
log("verify format:", p.eval("""(function(){var s=document.querySelector('select.export-select'); return s?s.options[s.selectedIndex].text:'NOSEL';})()"""))

# Run Report
rr=p.eval("""(function(){var b=Array.from(document.querySelectorAll('button,a,input[type=button],input[type=submit]')).find(function(e){return /Run Report/i.test((e.innerText||e.value||''));}); if(!b) return 'NORUN'; b.click(); return 'RUN clicked';})()""")
log("run report:", rr)

deadline=time.time()+60; newfiles=set()
while time.time()<deadline:
    cur=set(os.listdir(DLDIR)); newfiles=cur-before_files
    done=[f for f in newfiles if not f.endswith(".crdownload")]
    if done: break
    time.sleep(2)
log("new files:", json.dumps(sorted(newfiles)))
for f in sorted(newfiles):
    fp=os.path.join(DLDIR,f); sz=os.path.getsize(fp); log("FILE:", f, "size:", sz)
    if f.lower().endswith(".csv"):
        with open(fp,"r",errors="replace") as fh: lines=fh.read().splitlines()
        log("CSV rows(incl header):", len(lines))
        log("CSV header:", json.dumps(lines[0][:250] if lines else ""))
        if len(lines)>1: log("CSV row1:", json.dumps(lines[1][:250]))
log("url after:", p.eval("location.href"))
log("DONE_CSV")
p.close(); bws.close()
