"""本主题专属离线算法，仅读取同目录合成JSON，不联网、不控制设备。"""
import csv, json, math, re, struct
from pathlib import Path
from fractions import Fraction
BASE=Path(__file__).resolve().parent
data=json.loads((BASE/'input.json').read_text(encoding='utf-8'))['data']
cabs=data['cabinets'];assert len({c['id'] for c in cabs})==len(cabs)
for c in cabs:assert c['w']>0 and c['h']>0
for i,a in enumerate(cabs):
 for b in cabs[i+1:]:assert min(a['x']+a['w'],b['x']+b['w'])<=max(a['x'],b['x']) or min(a['y']+a['h'],b['y']+b['h'])<=max(a['y'],b['y'])
x0=min(c['x'] for c in cabs);y0=min(c['y'] for c in cabs);x1=max(c['x']+c['w'] for c in cabs);y1=max(c['y']+c['h'] for c in cabs)
w,h=x1-x0,y1-y0;area=sum(c['w']*c['h'] for c in cabs)
mapped=[dict(c,x=c['x']-x0,y=c['y']-y0) for c in cabs]
assert (w,h,area,w*h-area)==(576,320,125952,58368)
body=''.join(f'<rect x="{c["x"]}" y="{c["y"]}" width="{c["w"]}" height="{c["h"]}" fill="hsl({i*65},45%,75%)" stroke="black"/><text x="{c["x"]+8}" y="{c["y"]+24}" font-size="18">{c["id"]}</text>' for i,c in enumerate(mapped))
(BASE/'cabinet-map.svg').write_text(f'<svg xmlns="http://www.w3.org/2000/svg" width="{w}" height="{h}" viewBox="0 0 {w} {h}"><rect width="100%" height="100%" fill="#ddd"/>{body}</svg>',encoding='utf-8')
result={'canvas':[w,h],'translation':[-x0,-y0],'active_area':area,'blank_area':w*h-area,'mapped_cabinets':mapped}
(BASE/'result.json').write_text(json.dumps(result,ensure_ascii=False,indent=2)+'\n',encoding='utf-8')
print(json.dumps(result,ensure_ascii=False))
