import json, os, sys, time, urllib.request, glob
key=os.environ["MESHY_API_KEY"]; base=sys.argv[1]; kind=sys.argv[2] if len(sys.argv)>2 else "image-to-3d"
suffix={"image-to-3d":"_gen","rigging":"_rig","animations":"_anim","retexture":"_retex"}[kind]
def get(url):
    r=urllib.request.Request(url,headers={"Authorization":"Bearer "+key}); return json.load(urllib.request.urlopen(r,timeout=60))
def dl(url,path):
    if os.path.exists(path): return
    urllib.request.urlretrieve(url,path)
tasks={}
for f in glob.glob(f"{base}/tasks/*{suffix}*.json"):
    name=os.path.basename(f)[:-5]
    d=json.loads(open(f,encoding="utf-8").read()); tid=d["structuredContent"]["task_id"]; tasks[name]=tid
ver={"image-to-3d":"v1/image-to-3d","rigging":"v1/rigging","animations":"v1/animations","retexture":"v1/retexture"}[kind]
deadline=time.time()+float(os.environ.get("WAIT","900")); done={}
while tasks and time.time()<deadline:
    for name,tid in list(tasks.items()):
        t=get(f"https://api.meshy.ai/openapi/{ver}/{tid}")
        st=t.get("status")
        if st in ("SUCCEEDED","FAILED","CANCELED","EXPIRED"):
            done[name]=t; del tasks[name]
            out=f"{base}/models/{name}"; os.makedirs(out,exist_ok=True)
            json.dump(t,open(f"{out}/task.json","w"),indent=1)
            if st=="SUCCEEDED":
                urls=t.get("model_urls") or t.get("result") or {}
                def walk(o,pre=""):
                    if isinstance(o,dict):
                        for k,v in o.items(): yield from walk(v,pre+k+".")
                    elif isinstance(o,str) and o.startswith("http") and ".glb" in o: yield pre[:-1],o
                if kind!="image-to-3d":
                    for k,u in walk({"model_urls":t.get("model_urls"),"result":t.get("result")}):
                        dl(u,f"{out}/{k.replace('.','_')}.glb")
                if kind in ("image-to-3d","retexture") and t.get("thumbnail_urls"):
                    for v,u in t["thumbnail_urls"].items(): dl(u,f"{out}/{v}.png")
                if kind=="image-to-3d":
                    dl(urls["glb"],f"{out}/model.glb")
                    if t.get("thumbnail_url"): dl(t["thumbnail_url"],f"{out}/thumb.png")
                    for i,u in enumerate(t.get("multi_view_thumbnail_urls") or t.get("multi_view_thumbnails") or []):
                        if isinstance(u,str): dl(u,f"{out}/view{i}.png")
            print(name,st,t.get("task_error") or "",flush=True)
    if tasks: time.sleep(15)
for n in tasks: print(n,"STILL RUNNING")
