import sys, time, json, urllib.request
sys.path.insert(0, "/tmp/amdwork")
import cdp
LOG="/tmp/amdwork/rc_fmt2.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"]
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" in (href or ""):
    p.navigate("https://static-100.advancedmd.com/practicemanager/reportcenter/#/main/ProvidersGroups/685")
    time.sleep(5)
log("url:", p.eval("location.href"))

# Selects on page
sels=p.eval("""(function(){
  return JSON.stringify(Array.from(document.querySelectorAll('select')).map(function(s){
    return {id:s.id,name:s.name,ng:(s.getAttribute('ng-model')||''),opts:Array.from(s.options).map(function(o){return o.text.trim();}),val:s.value};
  }));
})()""")
log("SELECTS:", sels)

# Find the element that literally contains 'CSV(COMMA DELIMITED)' and show its tag + nearby clickable ancestor
csvinfo=p.eval("""(function(){
  var node=null;
  var w=document.createTreeWalker(document.body, NodeFilter.SHOW_TEXT, null);
  while(w.nextNode()){ if(/CSV\\s*\\(COMMA/i.test(w.currentNode.nodeValue)){ node=w.currentNode.parentElement; break; } }
  if(!node) return 'NO_CSV_TEXT';
  var info={tag:node.tagName, cls:node.className, ng:(node.getAttribute('ng-click')||node.getAttribute('ng-model')||''), html:node.outerHTML.slice(0,400)};
  // climb to find element with ng-click or that looks selectable
  var c=node, path=[];
  for(var i=0;i<5 && c;i++){ path.push({tag:c.tagName, cls:(c.className||'').slice(0,60), ngclick:c.getAttribute&&(c.getAttribute('ng-click')||''), ngmodel:c.getAttribute&&(c.getAttribute('ng-model')||'')}); c=c.parentElement; }
  info.path=path;
  return JSON.stringify(info);
})()""")
log("CSV ELEMENT INFO:", csvinfo)
log("DONE_FMT2")
p.close()
