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

LOG="/tmp/enum_progress.log"
def log(m):
    line=f"{time.strftime('%H:%M:%S')} {m}"
    print(line, flush=True)
    open(LOG,"a").write(line+"\n")

os.makedirs('/tmp/days', exist_ok=True)

# Full window: kept window 4/24..6/16 + future window 6/17..8/15
# (4/1..4/23 already cached)
def daterange(a,b):
    d=a
    while d<=b:
        yield d
        d+=timedelta(days=1)

targets=[]
for d in daterange(date(2026,4,24), date(2026,8,15)):
    ds=d.strftime("%Y-%m-%d")
    fp=f"/tmp/days/{ds}.json"
    if not os.path.exists(fp):
        targets.append(ds)

log(f"START. days to fetch: {len(targets)} (first={targets[0] if targets else None} last={targets[-1] if targets else None})")

def get_status(sid):
    st=call(sid,"auth_status",{})  # amd_lib.call already returns parsed json
    return st

# initial cooldown wait WITHOUT probing repeatedly: only check status once, sleep the reported time
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:
        wait=(mins+2)*60
        log(f"COOLDOWN active, minsLeft={mins}. sleeping {wait}s")
        time.sleep(wait)
        sid=session()

i=0
n=len(targets)
while i < n:
    ds=targets[i]
    fp=f"/tmp/days/{ds}.json"
    if os.path.exists(fp):
        i+=1; continue
    try:
        r=call(sid,"get_visit_info_by_date",{"visitdate":ds})
        rows=r.get("rows",[])
        json.dump(rows, open(fp,"w"))
        log(f"OK {ds} rows={len(rows)} ({i+1}/{n})")
        i+=1
        time.sleep(1.0)
    except Exception as e:
        msg=str(e)
        if "cooldown" in msg.lower() or "rate" in msg.lower() or "limit" in msg.lower():
            # parse minsLeft from a fresh status (single check, allowed since we're already limited)
            try:
                st=get_status(sid)
                cds=st.get("cooldowns",{})
                mins=max((v.get("minsLeft",0) for v in cds.values()), default=60)
            except Exception:
                mins=60
            wait=(mins+2)*60
            log(f"RATE-LIMITED at {ds}. minsLeft={mins}, sleeping {wait}s")
            time.sleep(wait)
            sid=session()
            # do not advance i; retry same day
        else:
            log(f"ERR {ds}: {msg[:80]} -- retry once after 5s")
            time.sleep(5)
            try:
                r=call(sid,"get_visit_info_by_date",{"visitdate":ds})
                rows=r.get("rows",[])
                json.dump(rows, open(fp,"w"))
                log(f"OK(retry) {ds} rows={len(rows)} ({i+1}/{n})")
                i+=1
                time.sleep(1.0)
            except Exception as e2:
                log(f"ERR2 {ds}: {str(e2)[:80]} -- skipping, will not advance, re-session")
                sid=session()
                time.sleep(2)

log(f"DONE. all {n} target days fetched.")
open("/tmp/enum_DONE","w").write("done\n")
