import urllib.request, time, json
from rembg import remove
from PIL import Image, ImageDraw
from pathlib import Path

OBJ = Path(r"C:\allgifted\mathapi11v2\public\assets\math\objects"); SRC = OBJ/"source"
base = "https://d8j0ntlcm91z4.cloudfront.net/user_3ENYB9gUptp5V9uUGoiaDV631pi/"
TARGET = 120*1024
M = {
 "eraser":("c9ea682b","hf_20260529_143447_c9ea682b-723f-425e-ab33-08c28ae6f3f3.png"),
 "cloud":("771c47bb","hf_20260529_143452_771c47bb-5729-4548-8d3d-aebc1d4ad2eb.png"),
 "rugby-ball":("9887c4c0","hf_20260529_143500_9887c4c0-1c84-4b2f-b7cc-518d14b05221.png"),
 "domino":("e1ab702e","hf_20260529_143506_e1ab702e-6267-44f2-a2c5-d05dfc773554.png"),
 "key":("3f938633","hf_20260529_143512_3f938633-9c3a-4cae-856e-9d81c65abe5e.png"),
 "party-hat":("a9ed4c4c","hf_20260529_143517_a9ed4c4c-15ca-4c48-9224-85315278666a.png"),
 "chips-bag":("2da9ccf8","hf_20260529_143714_2da9ccf8-e759-4fcc-af62-9a1be2777672.png"),
 "bread-loaf":("589f689c","hf_20260529_143721_589f689c-be4e-4775-a414-992c273814f0.png"),
 "helicopter":("11754834","hf_20260529_143728_11754834-d1d1-457c-b26f-b8f94722f6f9.png"),
 "ambulance":("32d4ac96","hf_20260529_143735_32d4ac96-85de-43b2-aea7-83c86560052f.png"),
 "police-car":("78a3bd53","hf_20260529_143744_78a3bd53-f19e-4044-b74d-73e26c32bb07.png"),
 "aeroplane":("297bc79f","hf_20260529_143751_297bc79f-3d4f-4b28-9245-27efadcf21f3.png"),
 "van":("bf13cd1c","hf_20260529_143757_bf13cd1c-fdca-46f9-ac8c-d48b61e1e67e.png"),
}
def fetch(u,d):
    for _ in range(5):
        try: urllib.request.urlretrieve(u,d); return True
        except Exception: time.sleep(2)
    return False
new=[]
for name,(jid,fn) in M.items():
    tmp=SRC/("_src_"+name+".png"); fetch(base+fn,tmp)
    cut=remove(Image.open(tmp).convert("RGBA"))
    cut.save(SRC/f"ags-math-obj-{name}.png",optimize=True); tmp.unlink()
    webp=OBJ/f"ags-math-obj-{name}.webp"
    for q in (90,86,82,78):
        cut.save(webp,"WEBP",quality=q,lossless=False)
        if webp.stat().st_size<=TARGET: break
    kb=webp.stat().st_size/1024
    new.append({"id":name,"filename":webp.name,"higgsfield_job_id":jid,"file_size_kb":round(kb,1),
        "cdn_url":f"https://math.allgifted.com/objects/{webp.name}","format":"webp","background":"transparent","badge":"none","status":"approved"})
    print(f"{webp.name:34s} {kb:6.1f}KB",flush=True)
mf=OBJ/"ags_math_objects_manifest.json"; m=json.loads(mf.read_text(encoding="utf-8"))
ex={e["id"] for e in m["objects"]}
for e in new:
    if e["id"] not in ex: m["objects"].append(e)
m["count"]=len(m["objects"]); mf.write_text(json.dumps(m,indent=2),encoding="utf-8")
print("objects manifest now:",m["count"])
cv=Image.new("RGB",(7*180,2*180),(120,120,120)); dr=ImageDraw.Draw(cv)
for i,e in enumerate(new):
    im=Image.open(OBJ/e["filename"]).convert("RGBA"); im.thumbnail((168,150),Image.LANCZOS)
    r,c=divmod(i,7); x,y=c*180,r*180
    cv.paste(im,(x+(180-im.width)//2,y+20+(150-im.height)//2),im)
    dr.rectangle([x,y,x+179,y+16],fill=(20,20,20)); dr.text((x+2,y+3),e["id"],fill=(255,255,0))
cv.save(r"C:\allgifted\logo-reveal\objects_batch2.png"); print("sheet ready")
