from pathlib import Path
from PIL import Image,ImageDraw
import json
p=Path(__file__).resolve().parent; rows=json.loads((p/'control/font_rows.json').read_text());font={tuple(sum(int(r[y][x])<<y for y in range(7)) for x in range(5)):ch for ch,r in rows.items()}
scenarios={'valid100':['FAN ON','LEVEL 4','SUCTION 100%','SUCTION VALID'],'low37':['FAN ON','LEVEL 4','SUCTION 037%','CHECK FILTER'],'unqualified':['FAN ON','LEVEL 4','SUCTION --%','VALUE UNAVAILABLE'],'learning':['CALIBRATING','LEVEL 4','SUCTION --%','VALUE UNAVAILABLE']}
canvas=Image.new('RGB',(824,360),'#ddd');draw=ImageDraw.Draw(canvas)
for i,(name,expected) in enumerate(scenarios.items()):
 b=(p/'previews'/f'{name}.bin').read_bytes();assert len(b)==512
 decoded=[''.join(font[tuple(b[page*128+x*6:page*128+x*6+5])] for x in range(21)).rstrip() for page in range(4)];assert decoded==expected,(name,decoded)
 im=Image.new('RGB',(128,32),'black');pix=im.load()
 for page in range(4):
  for x in range(128):
   for bit in range(8):
    if b[page*128+x]&(1<<bit):pix[x,page*8+bit]=(255,255,255)
 im=im.resize((384,96),Image.Resampling.NEAREST);canvas.paste(im,(16+(i%2)*408,42+(i//2)*156));draw.text((16+(i%2)*408,20+(i//2)*156),name,fill='black')
draw.text((16,335),'Engineering framebuffer preview; not a photograph or original-screen match.',fill='black')
canvas.save(p/'previews/framebuffer-review.png');(p/'previews/decoded-checks.json').write_text(json.dumps(scenarios,indent=2))
print('PASS independent pixel-to-glyph decode: all4 actual framebuffers')
