import json, urllib.request, time, os
from datetime import date

URL="https://claude-cloud.tail053faf.ts.net/advancedmd/mcp"
AUTH="Bearer f10221f209ad50494fd1fd86e62bda9236449b3b35b0a2d97b1ca7bfb86208b7"

def new_session():
    def post(body, sid=None):
        data=json.dumps(body).encode()
        req=urllib.request.Request(URL,data=data,method="POST")
        req.add_header("Authorization",AUTH); req.add_header("Content-Type","application/json")
        req.add_header("Accept","application/json, text/event-stream")
        if sid: req.add_header("Mcp-Session-Id",sid)
        resp=urllib.request.urlopen(req,timeout=90)
        s=resp.headers.get("Mcp-Session-Id"); raw=resp.read().decode()
        out=None
        if raw.lstrip().startswith("{"): out=json.loads(raw)
        else:
            for line in raw.splitlines():
                if line.startswith("data:"):
                    try: out=json.loads(line[5:].strip())
                    except: pass
        return s,out
    sid,_=post({"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2024-11-05","capabilities":{},"clientInfo":{"name":"b","version":"1"}}})
    data=json.dumps({"jsonrpc":"2.0","method":"notifications/initialized"}).encode()
    req=urllib.request.Request(URL,data=data,method="POST")
    req.add_header("Authorization",AUTH); req.add_header("Content-Type","application/json")
    req.add_header("Accept","application/json, text/event-stream"); req.add_header("Mcp-Session-Id",sid)
    urllib.request.urlopen(req,timeout=30).read()
    return sid

SID=new_session()
def call(name, args):
    body={"jsonrpc":"2.0","id":99,"method":"tools/call","params":{"name":name,"arguments":args}}
    data=json.dumps(body).encode()
    req=urllib.request.Request(URL,data=data,method="POST")
    req.add_header("Authorization",AUTH); req.add_header("Content-Type","application/json")
    req.add_header("Accept","application/json, text/event-stream"); req.add_header("Mcp-Session-Id",SID)
    resp=urllib.request.urlopen(req,timeout=90); raw=resp.read().decode()
    out=None
    if raw.lstrip().startswith("{"): out=json.loads(raw)
    else:
        for line in raw.splitlines():
            if line.startswith("data:"):
                try: out=json.loads(line[5:].strip())
                except: pass
    txt=out['result']['content'][0]['text']
    return json.loads(txt)

cands=json.load(open('/tmp/sheet1_candidate_newvisits.json'))
pids=list(cands.keys())
errors=[]
got=0
for pid in pids:
    fp=f"/tmp/histories/{pid}.json"
    if os.path.exists(fp): 
        continue
    try:
        d=call("get_appointment_history",{"patientid":pid})
        rows=[{"date":r["date"],"apptstatus":r["apptstatus"]} for r in d.get("rows",[])]
        json.dump(rows,open(fp,"w"))
        got+=1
        time.sleep(0.25)
    except Exception as e:
        errors.append((pid,str(e)[:80]))
        time.sleep(1)
print("fetched_new:",got,"errors:",len(errors))
if errors: print(errors[:10])
print("history files:",len(os.listdir('/tmp/histories')))
