from net import *
import pandas as pd
c=Client();events=pd.read_csv(R/'events.csv');total=0
for ev in events.itertuples():
    start=int(pd.Timestamp(ev.start,tz='UTC').timestamp());end=int(pd.Timestamp(ev.end,tz='UTC').timestamp());cursor='*';seen=set();rows=[];page=0;summary=None
    while True:
        dest=R/'review_pages'/f'{ev.appid}_{page:03}.json'
        if dest.exists():data=json.loads(dest.read_text());assert data['requested_cursor']==cursor
        else:
            params={'json':1,'filter':'recent','language':'all','purchase_type':'steam','review_type':'all','num_per_page':100,'filter_offtopic_activity':1,'date_range_type':'include','start_date':start,'end_date':end,'cursor':cursor}
            raw=json.loads(c.get(f'https://store.steampowered.com/appreviews/{ev.appid}',params,'event_review_window'));assert raw.get('success')==1
            safe=[{k:r.get(k) for k in ['recommendationid','timestamp_created','timestamp_updated','voted_up','steam_purchase','written_during_early_access','language','review']} for r in raw.get('reviews',[])]
            data={'appid':ev.appid,'retrieved_at':utc(),'params':params,'requested_cursor':cursor,'cursor':raw.get('cursor'),'query_summary':raw.get('query_summary'),'reviews':safe};dump(dest,data)
        if page==0:summary=data['query_summary']
        batch=data['reviews'];new=[r for r in batch if r['recommendationid'] not in seen]
        for r in new:
            assert start<=r['timestamp_created']<=end,(ev.appid,r['timestamp_created'],start,end)
            seen.add(r['recommendationid']);rows.append(dict(appid=ev.appid,**r))
        if not batch:break
        assert new and data['cursor'] and cursor!=data['cursor'];cursor=data['cursor'];page+=1
        if total+len(rows)>80000:raise RuntimeError('Review cap reached')
    out=R/'review_windows';out.mkdir(exist_ok=True);pd.DataFrame(rows).to_parquet(out/f'{ev.appid}.parquet',index=False);total+=len(rows)
    dump(R/'review_status'/f'{ev.appid}.json',{'appid':ev.appid,'collected':len(rows),'summary_total':summary['total_reviews'],'complete':True,'start':ev.start,'end':ev.end,'pages':page+1})
    print(json.dumps({'appid':ev.appid,'name':ev.name,'collected':len(rows),'summary_total':summary['total_reviews'],'total_so_far':total}),flush=True)
