import subprocess, os
OUT='/sessions/bold-dazzling-gates/mnt/Nexus/public/assets/img/omada/tipos'
SRC='/sessions/bold-dazzling-gates/mnt/Nexus/deploy/device-icons'
os.makedirs(OUT, exist_ok=True); os.makedirs(SRC, exist_ok=True)
COL='#48566b'
# Authored line icons (stroke). Recognizable device types.
STROKE = {
 'bulb': 'M12 3a6 6 0 0 0-3.8 10.6c.5.5.8 1.2.8 1.9V16h6v-.5c0-.7.3-1.4.8-1.9A6 6 0 0 0 12 3z M9.5 19h5 M10 21h4',
 'led-strip': 'M3 10h18a1 1 0 0 1 1 1v3a1 1 0 0 1-1 1H3a1 1 0 0 1-1-1v-3a1 1 0 0 1 1-1z M6 12.5h0 M10 12.5h0 M14 12.5h0 M18 12.5h0',
 'relay': 'M4 7h16a1 1 0 0 1 1 1v8a1 1 0 0 1-1 1H4a1 1 0 0 1-1-1V8a1 1 0 0 1 1-1z M7 12h3 M14 12h3 M12 9.5v5',
 'button': 'M12 12m-8 0a8 8 0 1 0 16 0a8 8 0 1 0 -16 0 M12 12m-3 0a3 3 0 1 0 6 0a3 3 0 1 0 -6 0',
 'scene-button': 'M12 12m-8 0a8 8 0 1 0 16 0a8 8 0 1 0 -16 0 M12 8l1 2.5 2.5 1-2.5 1L12 15l-1-2.5L8.5 11.5 11 10.5z',
 'dimmer': 'M4 13h16 M12 13m-3 0a3 3 0 1 0 6 0a3 3 0 1 0 -6 0 M12 6v2 M7 8l1 1 M17 8l-1 1',
 'remote': 'M8.5 3h7a1 1 0 0 1 1 1v16a1 1 0 0 1-1 1h-7a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1z M12 6.5h0 M10 10h0 M14 10h0 M10 13h0 M14 13h0 M12 17h0',
 'ceiling-light': 'M4 12a8 8 0 0 1 16 0z M9 12a3 3 0 0 0 6 0 M12 4V2',
 'spotlight': 'M7 4h10l-1.5 6h-7z M9 10v3a3 3 0 0 0 6 0v-3 M12 16v4',
 'rgb-bulb': 'M12 3a6 6 0 0 0-3.8 10.6c.5.5.8 1.2.8 1.9V16h6v-.5c0-.7.3-1.4.8-1.9A6 6 0 0 0 12 3z M10 21h4 M12 8v5 M9.5 10.5h5',
 'presence-sensor': 'M4 15a8 8 0 0 1 16 0 M8 15a4 4 0 0 1 8 0 M12 15h0',
 'contact-sensor': 'M4 5h6a1 1 0 0 1 1 1v12a1 1 0 0 1-1 1H4z M20 5h-6a1 1 0 0 0-1 1v12a1 1 0 0 0 1 1h6',
 'temperature-sensor': 'M12 4a2 2 0 0 0-2 2v7.2a3.5 3.5 0 1 0 4 0V6a2 2 0 0 0-2-2z M12 16.5h0',
 'humidity-sensor': 'M12 4c3 3.8 6 7.3 6 10.5a6 6 0 0 1-12 0C6 11.3 9 7.8 12 4z',
 'fan': 'M12 12m-1.5 0a1.5 1.5 0 1 0 3 0a1.5 1.5 0 1 0 -3 0 M12 10.5c.4-2.8-.8-5.2-2.8-6 -1 2 .2 4.4 2.8 6 M13.3 12.8c2.7 1 5.2-.1 6-2 -2-1-4.4.1-6 2 M11.2 13.3c-1.7 2.2-1.9 4.9-.6 6.5 1.6-1.2 1.9-3.7.6-6.5',
 'curtain': 'M3 4h18 M4 4v16 M20 4v16 M8 4c.6 5.3-.6 10 0 16 M12 4c.6 5.3-.6 10 0 16 M16 4c.6 5.3-.6 10 0 16',
 'blind': 'M4 4h16 M4 4v13l3 3 M4 8h16 M4 12h16 M4 16h16',
 'valve': 'M12 12m-3 0a3 3 0 1 0 6 0a3 3 0 1 0 -6 0 M3 12h6 M15 12h6 M9 6h6 M12 6v3',
 'siren': 'M6 17v-3a6 6 0 0 1 12 0v3z M4 20h16 M12 5V2 M6.5 7L5 5.5 M17.5 7L19 5.5',
 'outlet': 'M6 4h12a1 1 0 0 1 1 1v14a1 1 0 0 1-1 1H6a1 1 0 0 1-1-1V5a1 1 0 0 1 1-1z M10 9v3 M14 9v3',
 'power-strip': 'M3 9h18a1 1 0 0 1 1 1v4a1 1 0 0 1-1 1H3a1 1 0 0 1-1-1v-4a1 1 0 0 1 1-1z M6 11.5h0 M6 13h0 M10.5 11.5h0 M10.5 13h0 M15 11.5h0 M15 13h0',
 'tap-switch': 'M12 3a6 6 0 0 0-6 6v9a1 1 0 0 0 1 1h10a1 1 0 0 0 1-1V9a6 6 0 0 0-6-6z M9 9h0 M15 9h0 M12 13h0',
 'thermostat-dial': 'M12 12m-8 0a8 8 0 1 0 16 0a8 8 0 1 0 -16 0 M12 7v3 M12 12l3 2',
}
# Real hass-hue-icons paths (MIT, arallsopp/hass-hue-icons) — vendored fixtures.
FILL = {
 'floor-lamp': 'M19.43,7.08c-0.66-1.17-1.54-2.21-2.59-3.04h0.3c0.19,0,0.36-0.11,0.45-0.28c0.08-0.17,0.07-0.37-0.05-0.52 c-1.38-1.59-3.4-2.48-5.5-2.44l-0.06,0c-2.09-0.05-4.1,0.85-5.45,2.45C6.41,3.39,6.39,3.6,6.48,3.76c0.09,0.17,0.26,0.27,0.45,0.27 h0.18c-1.04,0.84-1.9,1.88-2.54,3.05C4.49,7.24,4.5,7.42,4.59,7.57c0.09,0.15,0.25,0.24,0.43,0.24h6.35v10.82c0,0.02,0,0.06,0,0.11 c-0.01,0.13-0.04,0.26-0.1,0.37c-0.2,0.29-0.53,0.46-0.88,0.45c-0.86,0.09-1.72,0.24-2.56,0.47c-0.38,0.09-0.75,0.22-1.11,0.37 C6.52,20.48,6,20.72,6,21.19c0,0.85,1.47,1.57,1.94,1.68c1.26,0.24,2.55,0.35,3.84,0.32c1.33,0.03,2.65-0.08,3.96-0.32 c0.39-0.15,0.76-0.36,1.08-0.63c0.47-0.29,0.78-0.77,0.86-1.31c0-0.62-0.76-0.88-1.91-1.1c-0.83-0.15-1.68-0.25-2.52-0.31 c-0.31,0.01-0.6-0.15-0.75-0.42c-0.06-0.12-0.1-0.26-0.11-0.39c0-0.05,0-0.09,0-0.1l0,0V7.81h6.61c0.17,0,0.34-0.09,0.43-0.24 C19.5,7.42,19.51,7.24,19.43,7.08z M8.51,2.8c1.04-0.68,2.27-1.03,3.52-1.01c1.25-0.01,2.47,0.35,3.53,1.03 c0.11,0.07,0.22,0.15,0.32,0.22h-7.7C8.27,2.96,8.39,2.88,8.51,2.8z M5.91,6.81C6.68,5.67,7.7,4.72,8.9,4.04h6.11 c1.22,0.67,2.27,1.62,3.06,2.77L5.91,6.81z',
 'wall-light': 'M21.6,8.8H2.4C1.6,8.8,1,9.7,1,10.7v1.9c0,1.1,0.7,1.6,1.4,1.6h6.9c0,0,0,0,0,0.1v0.4c0,0.6,0.5,1.1,1.1,1.1 h3.3c0.6,0,1.1-0.5,1.1-1.1v-0.4c0,0,0,0,0-0.1h6.9c0.7,0,1.4-0.5,1.4-1.6v-1.9C23,9.7,22.4,8.8,21.6,8.8z M21.6,13.2H2.4 c-0.1,0-0.4,0-0.4-0.6c0-0.5,0.3-0.9,0.4-0.9h19.1c0.2,0,0.4,0.3,0.4,0.9C22,13.2,21.7,13.2,21.6,13.2z',
}
def wrap(inner):
    return ('<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="160" height="160">'+inner+'</svg>')
made=[]
for name,d in STROKE.items():
    inner=f'<path fill="none" stroke="{COL}" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round" d="{d}"/>'
    open(f'{SRC}/{name}.svg','w').write(wrap(inner))
    made.append(name)
for name,d in FILL.items():
    inner=f'<path fill="{COL}" d="{d}"/>'
    open(f'{SRC}/{name}.svg','w').write(wrap(inner))
    made.append(name)
ok=0; fail=[]
for name in made:
    r=subprocess.run(['convert','-background','none',f'{SRC}/{name}.svg',f'{OUT}/{name}.png'],capture_output=True)
    if r.returncode==0 and os.path.getsize(f'{OUT}/{name}.png')>200: ok+=1
    else: fail.append((name, r.stderr.decode()[:80]))
print('gerados', ok, 'de', len(made))
for f in fail: print('FALHOU', f)
