#!/usr/bin/env python3
"""Generate CLP/GHS pictograms as proper PNG images using Pillow."""
from PIL import Image, ImageDraw, ImageFont
from pathlib import Path
import math

OUT = Path("/root/projects/jg/2026-consult-REACH-kennisdossier/assets/clp-pictograms")
SIZE = 400  # px

def diamond(img, color=(0, 0, 0)):
    """Draw red diamond border with white fill."""
    draw = ImageDraw.Draw(img)
    s = SIZE
    cx, cy = s//2, s//2
    margin = 15
    outer = [(cx, margin), (s-margin, cy), (cx, s-margin), (margin, cy)]
    inner_margin = margin + 28
    inner = [(cx, inner_margin), (s-inner_margin, cy), (cx, s-inner_margin), (inner_margin, cy)]
    draw.polygon(outer, fill=(255,0,0), outline=(0,0,0))
    draw.polygon(inner, fill=(255,255,255), outline=(0,0,0))

def get_font(size=120):
    for p in ["/usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf",
              "/usr/share/fonts/truetype/liberation/LiberationSans-Bold.ttf"]:
        if Path(p).exists():
            return ImageFont.truetype(p, size)
    return ImageFont.load_default()

def make_text_icon(text, filename, font_size=160):
    img = Image.new("RGBA", (SIZE, SIZE), (0,0,0,0))
    diamond(img)
    draw = ImageDraw.Draw(img)
    font = get_font(font_size)
    bbox = draw.textbbox((0,0), text, font=font)
    tw, th = bbox[2]-bbox[0], bbox[3]-bbox[1]
    draw.text(((SIZE-tw)//2, (SIZE-th)//2 - 10), text, fill=(0,0,0), font=font)
    img.save(str(OUT / filename))

def draw_skull(draw, cx, cy, r):
    """Simple skull."""
    # Head
    draw.ellipse([cx-r, cy-r, cx+r, cy+r+10], outline=(0,0,0), width=6)
    # Eyes
    er = r//3
    draw.ellipse([cx-r//2-er, cy-r//3-er, cx-r//2+er, cy-r//3+er], fill=(0,0,0))
    draw.ellipse([cx+r//2-er, cy-r//3-er, cx+r//2+er, cy-r//3+er], fill=(0,0,0))
    # Nose
    draw.polygon([(cx, cy+r//6), (cx-r//5, cy+r//2), (cx+r//5, cy+r//2)], fill=(0,0,0))
    # Crossbones
    draw.line([(cx-r-15, cy+r+30), (cx+r+15, cy-r)], fill=(0,0,0), width=8)
    draw.line([(cx+r+15, cy+r+30), (cx-r-15, cy-r)], fill=(0,0,0), width=8)

def draw_flame(draw, cx, cy, h):
    """Simple flame shape."""
    w = h//2
    # Outer flame
    draw.polygon([
        (cx, cy-h//2),
        (cx+w, cy+h//3),
        (cx+w//2, cy+h//4),
        (cx+w//3, cy+h//2),
        (cx, cy+h//4),
        (cx-w//3, cy+h//2),
        (cx-w//2, cy+h//4),
        (cx-w, cy+h//3),
    ], outline=(0,0,0), width=5)
    # Inner flame
    draw.polygon([
        (cx, cy-h//6),
        (cx+w//3, cy+h//4),
        (cx, cy+h//6),
        (cx-w//3, cy+h//4),
    ], fill=(0,0,0))

def draw_exclamation(draw, cx, cy, h):
    w = h//6
    # Vertical bar
    draw.rectangle([cx-w, cy-h//2, cx+w, cy+h//8], fill=(0,0,0))
    # Dot
    draw.ellipse([cx-w, cy+h//4, cx+w, cy+h//2], fill=(0,0,0))

def draw_tree_fish(draw, cx, cy, h):
    """Dead tree + fish for environmental hazard."""
    w = h//3
    # Tree trunk
    draw.rectangle([cx-w//2-30, cy-h//4, cx-w//2-30+8, cy+h//2], fill=(0,0,0))
    # Dead branches
    draw.line([(cx-w//2-26, cy-h//4+10), (cx-w//2-26-30, cy-h//2)], fill=(0,0,0), width=5)
    draw.line([(cx-w//2-26, cy-h//6), (cx-w//2-26+30, cy-h//3)], fill=(0,0,0), width=5)
    # Fish (simple)
    fish_cx = cx + 20
    fish_cy = cy + h//4
    draw.ellipse([fish_cx-30, fish_cy-15, fish_cx+30, fish_cy+15], outline=(0,0,0), width=4)
    # Tail
    draw.polygon([(fish_cx+30, fish_cy), (fish_cx+50, fish_cy-15), (fish_cx+50, fish_cy+15)], outline=(0,0,0), width=3)
    # Eye
    draw.ellipse([fish_cx-15, fish_cy-5, fish_cx-5, fish_cy+5], fill=(0,0,0))
    # Dead fish - X eye
    draw.line([(fish_cx-12, fish_cy-8), (fish_cx-3, fish_cy+1)], fill=(0,0,0), width=3)
    draw.line([(fish_cx-3, fish_cy-8), (fish_cx-12, fish_cy+1)], fill=(0,0,0), width=3)

def draw_health_hazard(draw, cx, cy, h):
    """Person with star/explosion - serious health hazard."""
    w = h//2
    # Head
    hr = h//5
    draw.ellipse([cx-hr, cy-h//2-hr, cx+hr, cy-h//2+hr], outline=(0,0,0), width=5)
    # Torso
    draw.polygon([
        (cx-hr-5, cy-h//2+hr),
        (cx+hr+5, cy-h//2+hr),
        (cx+w//2, cy+h//2),
        (cx-w//2, cy+h//2),
    ], outline=(0,0,0), width=5)
    # Star on torso
    star_cx, star_cy = cx, cy
    sr = h//6
    for angle in range(0, 360, 72):
        rad = math.radians(angle - 90)
        rad2 = math.radians(angle - 90 + 36)
        x1 = star_cx + sr * math.cos(rad)
        y1 = star_cy + sr * math.sin(rad)
        x2 = star_cx + sr//2 * math.cos(rad2)
        y2 = star_cy + sr//2 * math.sin(rad2)
        draw.line([(x1, y1), (x2, y2)], fill=(0,0,0), width=3)

def draw_corrosion(draw, cx, cy, h):
    """Corrosive - two drops falling on hand/surface."""
    w = h//2
    # Two test tubes dripping
    # Left drop
    dx = cx - w//3
    dy = cy - h//4
    draw.polygon([(dx, dy-20), (dx-12, dy+12), (dx+12, dy+12)], fill=(0,0,0))
    # Right drop
    dx = cx + w//3
    draw.polygon([(dx, dy-20), (dx-12, dy+12), (dx+12, dy+12)], fill=(0,0,0))
    # Hands/surface being corroded
    draw.line([(cx-w//2, cy+h//3), (cx+w//2, cy+h//3)], fill=(0,0,0), width=4)
    # Hand
    draw.arc([cx-20, cy+h//4, cx+20, cy+h//2+20], 0, 180, fill=(0,0,0), width=5)

def draw_gas_cylinder(draw, cx, cy, h):
    """Gas cylinder."""
    w = h//4
    # Body
    draw.rectangle([cx-w, cy-h//3, cx+w, cy+h//2], outline=(0,0,0), width=5)
    # Top dome
    draw.arc([cx-w, cy-h//2, cx+w, cy-h//6], 180, 0, fill=(0,0,0), width=5)
    # Valve
    draw.rectangle([cx-w//2, cy-h//2-15, cx+w//2, cy-h//2+5], outline=(0,0,0), width=4)

def draw_oxidising(draw, cx, cy, h):
    """Flame over circle."""
    w = h//2
    # Circle
    cr = h//3
    draw.ellipse([cx-cr, cy+10-cr, cx+cr, cy+10+cr], outline=(0,0,0), width=5)
    # Flame above
    flame_cy = cy - h//4
    draw_flame(draw, cx, flame_cy, h//2)

def draw_exploding_bomb(draw, cx, cy, h):
    """Exploding bomb."""
    r = h//4
    # Bomb body
    draw.ellipse([cx-r-10, cy-10, cx+r-10, cy+r+10], outline=(0,0,0), width=5)
    # Fuse line going up-right
    draw.line([(cx+r-15, cy), (cx+r+20, cy-h//3)], fill=(0,0,0), width=5)
    # Explosion sparks
    for angle in [0, 45, 90, 135, 180]:
        rad = math.radians(angle)
        ex = cx + r + 30 + 15*math.cos(rad)
        ey = cy - h//3 - 10 + 15*math.sin(rad)
        draw.line([(cx+r+15, cy-h//3-10), (ex, ey)], fill=(0,0,0), width=4)
    # Center spark
    draw.ellipse([cx+r+5, cy-h//3-25, cx+r+25, cy-h//3+5], outline=(0,0,0), width=4)

def make_draw_icon(draw_fn, filename):
    img = Image.new("RGBA", (SIZE, SIZE), (0,0,0,0))
    diamond(img)
    draw = ImageDraw.Draw(img)
    draw_fn(draw, SIZE//2, SIZE//2, SIZE//2)
    img.save(str(OUT / filename))

# Generate all 9
make_draw_icon(draw_exploding_bomb, "ghs01.png")
make_draw_icon(draw_flame, "ghs02.png")
make_draw_icon(draw_oxidising, "ghs03.png")
make_draw_icon(draw_gas_cylinder, "ghs04.png")
make_draw_icon(draw_corrosion, "ghs05.png")
make_draw_icon(draw_skull, "ghs06.png")
make_draw_icon(draw_exclamation, "ghs07.png")
make_draw_icon(draw_tree_fish, "ghs08.png")
make_draw_icon(draw_health_hazard, "ghs09.png")

print("Done! Generated 9 CLP pictograms.")
