import sys, json, os, time, pickle
sys.path.insert(0,'/tmp')
from amd_lib import session, call
from datetime import date

TODAY=date(2026,6,16)
SCHED_OR_KEPT={0,1,2,3,5,7,8,9}
STATUSNAME={10:"Cancelled",11:"No-Show"}
def pmd(s): m,d,y=s.split('/'); return date(int(y),int(m),int(d))
def piso(s): p=s.split('-'); return date(int(p[0]),int(p[1]),int(p[2]))

PEND=['17618606','17617430','17618224','17617637']
cands=json.load(open('/tmp/sheet1_candidate_newvisits.json'))
bypid=pickle.load(open('/tmp/existing_bypid.pkl','rb'))

def get_status(sid): return call(sid,"auth_status",{})
sid=session()
st=get_status(sid); cds=st.get("cooldowns",{})
if cds:
    mins=max((v.get("minsLeft",0) for v in cds.values()),default=0)
    if mins>0:
        print(f"cooldown {mins}m sleeping",flush=True); time.sleep((mins+2)*60); sid=session()

os.makedirs('/tmp/histories',exist_ok=True)
new_rows=[]
for pid in PEND:
    fp=f"/tmp/histories/{pid}.json"
    if not os.path.exists(fp):
        for attempt in range(5):
            try:
                d=call(sid,"get_appointment_history",{"patientid":pid})
                json.dump([{"date":x["date"],"apptstatus":x["apptstatus"]} for x in d.get("rows",[])], open(fp,"w"))
                time.sleep(1.0); break
            except Exception as e:
                msg=str(e)
                if "cool" in msg.lower() or "rate" in msg.lower() or "limit" in msg.lower():
                    try:
                        stt=get_status(sid); cc=stt.get("cooldowns",{}); mins=max((v.get("minsLeft",0) for v in cc.values()),default=60)
                    except: mins=60
                    print(f"rate-limited on {pid}, sleeping {mins}m",flush=True); time.sleep((mins+2)*60); sid=session()
                else:
                    print("err",pid,msg[:60]); time.sleep(5)
    hist=json.load(open(fp))
    nv=sorted(cands[pid],key=lambda r:piso(r['date']))[0]
    anchor=piso(nv['date'])
    has_fu=any(pmd(h['date'])>anchor and int(h['apptstatus']) in SCHED_OR_KEPT for h in hist)
    qualifies = not has_fu
    print(f"{pid}: anchor {nv['date']} type {nv['type']} -> qualifies={qualifies} (has_followup={has_fu})")
    if qualifies:
        er=None
        for row in bypid.get(pid,[]):
            if str(row['date'])==nv['date'] and (row['type'] or '')==nv['type']:
                er=row; break
        if er is None:
            er=bypid.get(pid,[{}])[0] if bypid.get(pid) else {}
        days=(TODAY-anchor).days
        new_rows.append({
            "name":er.get('name',''),"phone":er.get('phone',''),"email":er.get('email',''),
            "lastdate":anchor.strftime("%Y-%m-%d"),"lasttype":nv['type'],
            "laststatus":STATUSNAME.get(nv['statuscode'],str(nv['statuscode'])),
            "provider":nv.get('provider') or er.get('provider',''),
            "facility":nv.get('facility') or er.get('facility',''),
            "days":days,"dx":"","pid":pid})
json.dump(new_rows, open('/tmp/sheet1_append.json','w'))
print("Sheet1 NEW qualifying rows:",len(new_rows))
