import pandas as pd,numpy as np
C='confounded/'
def rd(f): return pd.read_csv(C+f,sep=None,engine='python')
def lab_or(df,stim,cond):
    s=df[stim].copy(); m=s.isna(); s[m]=df.loc[m,cond].astype(str); return s.astype(str)
def between(f,stim,cond,y,filt=None):
    d=rd(f)
    if filt is not None: d=d[filt(d)]
    out=pd.DataFrame({'subj':d.subject.astype(str),'stim':lab_or(d,stim,cond),'cond':np.where(d[cond].astype(str).str.contains('save'),'save','del'),'y':d[y].astype(float)})
    return out.dropna(subset=['y'])
STUDIES={}
for k in range(1,5): STUDIES[f'MD25 S{k}']=('Color','between',lambda k=k: between(f'MD25_S{k}.csv','color','condition','rating_like',lambda d:d.usedata==True))
def md26(k):
    d=rd(f'MD26_S{k}.csv')
    if 'condition' in d: cond=d.condition
    else: cond=np.where(d.stimulus.isna(),'del','save')
    out=pd.DataFrame({'subj':d.subject.astype(str),'stim':d.stimulus.astype(str),'cond':cond,'y':d.response.astype(float)})
    if k==5: out=out[out.cond=='save']
    return out
for k in (5,6,7): STUDIES[f'MD26 S{k}']=('Color','within',lambda k=k: md26(k))
def mvd(f):
    d=rd(f); out=pd.DataFrame({'subj':d.subject.astype(str),'stim':d.stimulus.astype(str),'cond':np.where(d.food_condition.astype(str).str.contains('save'),'save','del'),'y':d.response.astype(float)})
    return out.groupby(['subj','stim','cond'],as_index=False).y.mean()
for lab,f in [('MVD2026a S1','MVD2026a_S1.csv'),('MVD2026a S2a','MVD2026a_S2a.csv'),('MVD2026a S2b','MVD2026a_S2b.csv'),('MVD2026a S2c','MVD2026a_S2c.csv')]:
    STUDIES[lab]=('Food','within',lambda f=f: mvd(f))
STUDIES['Storch S5']=('Chinese characters','between',lambda: between('Storch_S5.csv','char','char_condition','response_char_like'))
STUDIES['Storch S6']=('Chinese characters','between',lambda: between('Storch_S6.csv','char','char_condition','response_char_like'))
STUDIES['Storch S7']=('Pictures','between',lambda: between('Storch_S7.csv','pic','pic_condition','response_pic_like'))
def mv():
    d=rd('MaierVogel2026.csv');rows=[]
    for _,r in d.iterrows():
        for i in range(1,13): rows.append((str(r.subject),str(r[f'stimulus_{i}']),r[f'condition_{i}'],float(r[f'response_{i}'])))
    return pd.DataFrame(rows,columns=['subj','stim','cond','y'])
STUDIES['Maier & Vogel (2026)']=('Pictures','within',mv)
for lab,f in [('Storch S10a','Storch_S10a.csv'),('Storch S10b','Storch_S10b.csv'),('Storch S11','Storch_S11.csv')]:
    STUDIES[lab]=('Tones','between',lambda f=f: between(f,'tone','tone_condition','response_tone_like'))
if __name__=='__main__':
    for s,(c,dsn,fn) in STUDIES.items():
        x=fn(); print(f"{s:22s} {c:18s} {dsn:7s} N_subj={x.subj.nunique():5d} obs={len(x):6d} stim={x.stim.nunique():3d} per cond={x.groupby('cond').stim.nunique().to_dict()} min raters/stim={x.groupby('stim').size().min()}")
