from common import *
import json
g,t=load()
# Official schedules archived in official_sale_sources.json. End dates use half-open
# intervals at 10am US Pacific, the announced event boundary.
events=[('2023-03-16','2023-03-23'),('2023-06-29','2023-07-13'),('2023-11-21','2023-11-28'),('2023-12-21','2024-01-04'),
 ('2024-03-14','2024-03-21'),('2024-06-27','2024-07-11'),('2024-11-27','2024-12-04'),('2024-12-19','2025-01-02'),
 ('2025-03-13','2025-03-20'),('2025-06-26','2025-07-10'),('2025-09-29','2025-10-06'),('2025-12-18','2026-01-05')]
events=[(pd.Timestamp(a+' 10:00',tz='America/Los_Angeles').tz_convert('UTC'),pd.Timestamp(b+' 10:00',tz='America/Los_Angeles').tz_convert('UTC')) for a,b in events]
p=g[g.valid&~g.free&~g.explicit&g.year.between(2023,2025)].copy()
# Do not mislabel the tail of the unsourced 2022 winter sale as an ordinary day.
p=p[p.date.ge(pd.Timestamp('2023-01-10',tz='UTC'))]
p['during_sale']=False;p['before7']=False;p['after7']=False
for a,b in events:
    p['during_sale']|=p.date.ge(a)&p.date.lt(b)
    p['before7']|=p.date.ge(a-pd.Timedelta(days=7))&p.date.lt(a)
    p['after7']|=p.date.ge(b)&p.date.lt(b+pd.Timedelta(days=7))
p['sale_group']=np.select([p.during_sale,p.before7,p.after7],['during','before7','after7'],default='other')
p['weekday']=p.date.dt.tz_convert('America/Los_Angeles').dt.day_name()
rows=[]
for scope,base in [('all',p),('no_recorded_ea',p[~p.known_ea]),('selfpub_8_20',p[p.selfpub&p.price.between(7.5,20.5)])]:
    for group,a in base.groupby('sale_group'):
        b=base[base.sale_group.eq('other')]
        if group=='other':b=base[base.sale_group.eq('during')]
        for cols in [('year','price_band'),('year','month','price_band','primary')]:
            rows.append(dict(scope=scope,group=group,controls='+'.join(cols),**stats(a),**compare(a,b,cols=cols,min_controls=3)))
save(rows,'sale_timing.csv')
rows=[]
for dim in ['month','weekday']:
    for val,a in p.groupby(dim):rows.append(dict(dimension=dim,value=val,**stats(a),**compare(a,p[p[dim].ne(val)],cols=('year','price_band','primary'))))
save(rows,'calendar_timing.csv')
p[['appid','name','date','sale_group','weekday','price','reviews','h50']].to_csv(R/'timing_members.csv',index=False)
print('Timing tests complete')
