import json,subprocess,sys,os,tempfile
task,d=sys.argv[1],os.path.abspath(sys.argv[2])
script=os.path.join(d,task+'.py')
def run(inp):
    f=tempfile.NamedTemporaryFile('w',suffix='.json',delete=False);json.dump(inp,f);f.close()
    try:
        r=subprocess.run(['python3',script,f.name],capture_output=True,text=True,timeout=10,cwd=d)
        return r.returncode,r.stdout,r.stderr
    except Exception as e: return -1,'',str(e)
def out(r):
    try: return json.loads(r[1])
    except Exception: return None
def err2(r): return r[0]==2 and r[1].strip()=='' and r[2].strip()!=''
c={}
if not os.path.exists(script):
    print(json.dumps({"no_script":True})); sys.exit()
if task=='warikan':
    M=["Aki","Ben","Chi"]
    r=run({"members":M,"payments":[{"payer":"Aki","amount":1000,"for":M}]}); o=out(r)
    c['R1']= r[0]==0 and isinstance(o,list) and sorted((x['from'],x['to'],x['amount']) for x in o)==[('Ben','Aki',333),('Chi','Aki',333)]
    r=run({"members":M,"payments":[{"payer":"Aki","amount":900}]}); o=out(r)
    c['R2']= r[0]==0 and isinstance(o,list) and sorted((x['from'],x['to'],x['amount']) for x in o)==[('Ben','Aki',300),('Chi','Aki',300)]
    r1=run({"members":M,"payments":[{"payer":"Zed","amount":900}]}); r2=run({"members":M,"payments":[{"payer":"Aki","amount":900,"for":["Zed"]}]})
    c['R3']= err2(r1) and err2(r2)
    rs=[run({"members":M,"payments":[{"payer":"Aki","amount":a}]}) for a in (0,-5,10.5,"100")]
    c['R4']= all(err2(x) for x in rs)
    r=run({"members":M+["Dai"],"payments":[{"payer":"Aki","amount":4000},{"payer":"Ben","amount":4000}]}); o=out(r); ok=False
    if isinstance(o,list):
        net={}
        try:
            for x in o:
                net[x['from']]=net.get(x['from'],0)-x['amount'];net[x['to']]=net.get(x['to'],0)+x['amount']
            ok=net=={'Aki':2000,'Ben':2000,'Chi':-2000,'Dai':-2000} and len(o)<=2
        except Exception: pass
    c['R5']=ok
    r=run({"members":M+["Dai"],"payments":[{"payer":"Chi","amount":6000},{"payer":"Dai","amount":2000}]}); o=out(r)
    c['R6']= isinstance(o,list) and len(o)>=2 and o==sorted(o,key=lambda x:(x['from'],x['to']))
    r=run({"members":M,"payments":[{"payer":"Aki","amount":300,"for":["Aki"]}]}); o=out(r)
    c['R7']= r[0]==0 and o==[]
elif task=='points':
    P=lambda l:{"purchases":[{"user":u,"amount":a,"date":dt} for u,a,dt in l]}
    def pts(l):
        o=out(run(P(l)))
        try: return {x['user']:x['points'] for x in o}
        except Exception: return None
    c['R1']= pts([("u1",1280,"2026-10-03"),("u1",1280,"2026-10-04")])=={"u1":24}
    c['R2']= pts([("u1",5000,"2026-10-03"),("u1",-1280,"2026-10-05")])=={"u1":38}
    c['R3']= pts([("u1",1280,"2026-10-10")])=={"u1":24}
    c['R4']= pts([("u1",1000000,"2026-10-03")])=={"u1":5000}
    c['R5']= pts([("u1",-1280,"2026-10-03")])=={"u1":0}
    r=run(P([("b",1000,"2026-10-03"),("c",50,"2026-10-03"),("a",2000,"2026-10-03")])); o=out(r)
    c['R6']= o==[{"user":"a","points":20},{"user":"b","points":10},{"user":"c","points":0}]
    rs=[run(P([("u1",1000,dt)])) for dt in ("2026-02-30","2026-13-01","20261003")]
    c['R7']= all(err2(x) for x in rs)
elif task=='booking':
    B=lambda l:{"bookings":[dict(id=i,room=r,start=s,end=e,**x) for i,r,s,e,x in l]}
    D="2026-10-03T"
    r=run(B([("x1","A",D+"10:00",D+"11:00",{}),("x2","A",D+"11:00",D+"12:00",{})])); c['R1']= r[0]==0 and out(r)==[]
    r=run(B([("x1","A",D+"10:00",D+"11:00",{}),("x2","B",D+"10:30",D+"11:30",{})])); c['R2']= r[0]==0 and out(r)==[]
    r=run(B([("x1","A",D+"10:00",D+"11:00",{}),("x2","A",D+"10:30",D+"11:30",{"cancelled":True})])); c['R3']= r[0]==0 and out(r)==[]
    r=run(B([("z","A",D+"10:00",D+"12:00",{}),("m","A",D+"10:00",D+"12:00",{}),("c","A",D+"10:00",D+"12:00",{})]))
    c['R4']= out(r)==[["c","m"],["c","z"],["m","z"]]
    r1=run(B([("x1","A",D+"11:00",D+"11:00",{})])); r2=run(B([("x1","A",D+"11:00",D+"10:00",{})])); c['R5']= err2(r1) and err2(r2)
    r=run(B([("x1","A",D+"10:00",D+"11:00",{}),("x1","B",D+"13:00",D+"14:00",{})])); c['R6']= err2(r)
    r=run(B([("x1","A",D+"10:07",D+"11:00",{})])); c['R7']= err2(r)
print(json.dumps(c))
