#!/usr/bin/env python3
"""
Generate dinosaur coloring book pages for kids 4-7.
Style: Bold & Easy, thick lines (3-5px), cute expressions, simple shapes.
"""

from PIL import Image, ImageDraw
import os, math, random

OUT_DIR = "/home/node/.openclaw/workspace/books/dinosauri-colorare/images"
W, H = 2550, 3300  # 8.5x11" at 300 DPI

# Colors
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)

def setup_page(d):
    """Create a fresh white page with draw object."""
    img = Image.new("RGB", (W, H), WHITE)
    draw = ImageDraw.Draw(img)
    return img, draw

def save_page(img, name):
    """Save the image as PNG."""
    path = os.path.join(OUT_DIR, name)
    img.save(path, "PNG")
    return path

def thick_line(draw, xy, width=8, **kwargs):
    """Draw a thick line (multiple passes for thickness)."""
    draw.line(xy, width=width, fill=BLACK, **kwargs)

def thick_arc(draw, xy, start, end, width=8):
    draw.arc(xy, start, end, fill=BLACK, width=width)

def thick_ellipse(draw, xy, width=8):
    draw.ellipse(xy, outline=BLACK, width=width)

def thick_pieslice(draw, xy, start, end, width=8):
    draw.pieslice(xy, start, end, outline=BLACK, width=width)

def eye(draw, cx, cy, size=30):
    """Draw a cute eye: outer circle + pupil."""
    thick_ellipse(draw, (cx-size, cy-size, cx+size, cy+size), width=6)
    draw.ellipse((cx-size//3, cy-size//3, cx+size//3, cy+size//3), fill=BLACK)

def smile(draw, cx, cy, width=80, line_w=6):
    """Draw a cute smile arc."""
    thick_arc(draw, (cx-width, cy-width, cx+width, cy+width), 0, 180, width=line_w)

def blush(draw, cx, cy, size=25):
    """Small round blush."""
    draw.ellipse((cx-size, cy-size, cx+size, cy+size), fill=(200,200,200), outline=None)

# ============ PAGE DEFINITIONS ============

def page_01_trex():
    """T-Rex — cute, standing, big head, tiny arms"""
    img, draw = setup_page("T-Rex")
    cx, cy = W//2, H//2 - 100
    # Body (big oval)
    thick_ellipse(draw, (cx-200, cy-100, cx+200, cy+250), width=10)
    # Head (bigger oval, top right)
    thick_ellipse(draw, (cx+80, cy-350, cx+380, cy-50), width=10)
    # Tail (triangle-like)
    thick_line(draw, [cx-180, cy+100, cx-450, cy+300, cx-150, cy+230], width=10)
    # Legs
    thick_line(draw, [cx-80, cy+230, cx-80, cy+450], width=12)
    thick_line(draw, [cx+80, cy+230, cx+80, cy+450], width=12)
    # Feet
    thick_line(draw, [cx-130, cy+450, cx-30, cy+450], width=10)
    thick_line(draw, [cx+30, cy+450, cx+130, cy+450], width=10)
    # Tiny arms
    thick_line(draw, [cx+120, cy+50, cx+180, cy+120], width=8)
    thick_line(draw, [cx+160, cy-100, cx+220, cy-30], width=8)
    # Eyes
    eye(draw, cx+200, cy-220, 25)
    eye(draw, cx+280, cy-220, 25)
    # Smile
    smile(draw, cx+240, cy-120, 60, 6)
    # Teeth
    for dx in [-40, -10, 20, 50]:
        draw.polygon([(cx+240+dx, cy-60), (cx+245+dx, cy-80), (cx+250+dx, cy-60)], fill=BLACK)
    # Belly line
    thick_arc(draw, (cx-150, cy+20, cx+150, cy+200), 0, 180, width=6)
    # Ground line
    thick_line(draw, [200, cy+460, W-200, cy+460], width=6)
    # Small tufts of grass
    for gx in range(250, W-200, 200):
        thick_line(draw, [gx, cy+460, gx-15, cy+410], width=5)
        thick_line(draw, [gx, cy+460, gx+15, cy+410], width=5)
    return save_page(img, "01-t-rex.png")

def page_02_triceratops():
    """Triceratops — three horns, frill"""
    img, draw = setup_page("Triceratops")
    cx, cy = W//2, H//2
    # Body
    thick_ellipse(draw, (cx-200, cy-50, cx+200, cy+250), width=10)
    # Head (wider, with frill)
    thick_ellipse(draw, (cx-120, cy-300, cx+120, cy-50), width=8)
    # Frill (semi-circle behind head)
    thick_arc(draw, (cx-180, cy-420, cx+180, cy-100), 180, 360, width=8)
    thick_line(draw, [cx-120, cy-300, cx-180, cy-300], width=8)
    thick_line(draw, [cx+120, cy-300, cx+180, cy-300], width=8)
    # Frill dots
    for fx, fy in [(cx-100, cy-380), (cx, cy-400), (cx+100, cy-380), (cx-50, cy-350), (cx+50, cy-350)]:
        draw.ellipse((fx-12, fy-12, fx+12, fy+12), fill=BLACK)
    # Three horns
    thick_line(draw, [cx-60, cy-300, cx-100, cy-420], width=8)
    thick_line(draw, [cx, cy-300, cx, cy-440], width=8)
    thick_line(draw, [cx+60, cy-300, cx+100, cy-420], width=8)
    # Legs
    thick_line(draw, [cx-100, cy+230, cx-100, cy+430], width=12)
    thick_line(draw, [cx+100, cy+230, cx+100, cy+430], width=12)
    thick_line(draw, [cx-160, cy+250, cx-160, cy+400], width=12)
    thick_line(draw, [cx+160, cy+250, cx+160, cy+400], width=12)
    # Eyes
    eye(draw, cx-50, cy-190, 22)
    eye(draw, cx+50, cy-190, 22)
    # Beak
    draw.polygon([(cx-40, cy-120), (cx, cy-90), (cx+40, cy-120),
                  (cx+20, cy-140), (cx-20, cy-140)], outline=BLACK, width=6)
    # Belly
    thick_arc(draw, (cx-150, cy+30, cx+150, cy+200), 0, 180, width=6)
    # Ground
    thick_line(draw, [200, cy+450, W-200, cy+450], width=6)
    return save_page(img, "02-triceratopo.png")

def page_03_stegosaurus():
    """Stegosaurus — plates on back, tail spikes"""
    img, draw = setup_page("Stegosaurus")
    cx, cy = W//2, H//2 + 50
    # Body (wide)
    thick_ellipse(draw, (cx-280, cy-80, cx+200, cy+180), width=10)
    # Head (small, low)
    thick_ellipse(draw, (cx+170, cy-40, cx+280, cy+80), width=8)
    # Plates on back (triangles)
    plates = [(cx-220, cy-130), (cx-160, cy-180), (cx-90, cy-200),
              (cx-10, cy-210), (cx+60, cy-200), (cx+120, cy-170)]
    for px, py in plates:
        draw.polygon([(px-25, cy-50), (px, py), (px+25, cy-50)], outline=BLACK, width=8)
    # Tail (with spikes)
    thick_line(draw, [cx-260, cy+80, cx-450, cy+180], width=10)
    for sx, sy in [(cx-380, cy+110), (cx-420, cy+140), (cx-440, cy+170)]:
        draw.polygon([(sx-5, sy), (sx-25, sy-40), (sx-10, sy), (sx-25, sy+20)], outline=BLACK, width=6)
    # Legs
    thick_line(draw, [cx-140, cy+160, cx-140, cy+360], width=12)
    thick_line(draw, [cx-40, cy+160, cx-40, cy+360], width=12)
    thick_line(draw, [cx+60, cy+150, cx+60, cy+350], width=12)
    thick_line(draw, [cx+150, cy+120, cx+150, cy+320], width=12)
    # Eye
    eye(draw, cx+230, cy-5, 18)
    # Smile
    smile(draw, cx+230, cy+30, 30, 5)
    # Ground
    thick_line(draw, [150, cy+380, W-150, cy+380], width=6)
    return save_page(img, "03-stegosauro.png")

def page_04_brachiosaurus():
    """Brachiosaurus — long neck, tall"""
    img, draw = setup_page("Brachiosaurus")
    cx, cy = W//2, H//2 + 200
    # Body
    thick_ellipse(draw, (cx-200, cy-100, cx+180, cy+150), width=10)
    # Long neck
    thick_line(draw, [cx+100, cy-80, cx+180, cy-500, cx+120, cy-550], width=14)
    # Head (small)
    thick_ellipse(draw, (cx+80, cy-600, cx+180, cy-520), width=10)
    # Eye
    eye(draw, cx+120, cy-570, 18)
    # Smile
    smile(draw, cx+120, cy-545, 25, 5)
    # Nostril
    draw.ellipse((cx+90, cy-580, cx+100, cy-570), fill=BLACK)
    # Tail
    thick_line(draw, [cx-180, cy+50, cx-380, cy-50], width=10)
    # Legs (thick, like pillars)
    thick_line(draw, [cx-120, cy+130, cx-120, cy+300], width=14)
    thick_line(draw, [cx-40, cy+130, cx-40, cy+300], width=14)
    thick_line(draw, [cx+50, cy+120, cx+50, cy+280], width=14)
    thick_line(draw, [cx+130, cy+100, cx+130, cy+250], width=14)
    # Ground
    thick_line(draw, [100, cy+320, W-100, cy+320], width=6)
    # Clouds (simple arcs)
    for cx2, cy2 in [(400, 400), (700, 300), (2000, 350)]:
        thick_arc(draw, (cx2-60, cy2-40, cx2+60, cy2+40), 0, 360, width=5)
        thick_arc(draw, (cx2-20, cy2-60, cx2+80, cy2+20), 0, 360, width=5)
    return save_page(img, "04-brachiosauro.png")

def page_05_pterodactyl():
    """Pterodactyl — flying, wings spread"""
    img, draw = setup_page("Pterodactyl")
    cx, cy = W//2, H//2 - 100
    # Body (small oval)
    thick_ellipse(draw, (cx-60, cy-40, cx+60, cy+60), width=8)
    # Head (with crest)
    thick_ellipse(draw, (cx+50, cy-100, cx+150, cy-20), width=8)
    # Crest
    draw.polygon([(cx+80, cy-80), (cx+140, cy-180), (cx+110, cy-80)], outline=BLACK, width=6)
    # Beak
    draw.polygon([(cx+130, cy-60), (cx+210, cy-55), (cx+130, cy-40)], outline=BLACK, width=6)
    # Eye
    eye(draw, cx+95, cy-60, 14)
    # Left wing
    thick_line(draw, [cx-50, cy, cx-350, cy-200, cx-380, cy-180], width=8)
    thick_line(draw, [cx-50, cy, cx-350, cy-160, cx-380, cy-140], width=8)
    thick_line(draw, [cx-350, cy-200, cx-350, cy-160], width=6)
    # Right wing
    thick_line(draw, [cx+40, cy, cx+350, cy-250, cx+380, cy-230], width=8)
    thick_line(draw, [cx+40, cy, cx+350, cy-200, cx+380, cy-180], width=8)
    thick_line(draw, [cx+350, cy-250, cx+350, cy-200], width=6)
    # Tail
    thick_line(draw, [cx-50, cy+30, cx-120, cy+80], width=6)
    draw.polygon([(cx-120, cy+80), (cx-140, cy+60), (cx-130, cy+90)], fill=BLACK)
    # Legs
    thick_line(draw, [cx-20, cy+50, cx-20, cy+120, cx-40, cy+130], width=5)
    thick_line(draw, [cx+20, cy+50, cx+20, cy+120, cx+40, cy+130], width=5)
    # Ground
    thick_line(draw, [150, cy+200, W-150, cy+200], width=6)
    # Clouds
    for cx2, cy2 in [(300, 300), (2200, 250), (1800, 400)]:
        thick_arc(draw, (cx2-50, cy2-30, cx2+50, cy2+30), 0, 360, width=4)
        thick_arc(draw, (cx2-15, cy2-50, cx2+65, cy2+15), 0, 360, width=4)
    return save_page(img, "05-pterodattilo.png")

def page_06_ankylosaurus():
    """Ankylosaurus — armored, club tail"""
    img, draw = setup_page("Ankylosaurus")
    cx, cy = W//2, H//2
    # Body (wide, low)
    thick_ellipse(draw, (cx-250, cy-100, cx+200, cy+150), width=10)
    # Armor plates (small half-circles)
    for ax in range(cx-200, cx+160, 60):
        thick_arc(draw, (ax-30, cy-130, ax+30, cy-70), 180, 360, width=5)
    # Head (small, low)
    thick_ellipse(draw, (cx+180, cy-50, cx+280, cy+50), width=8)
    # Eye
    eye(draw, cx+230, cy-15, 16)
    # Smile
    smile(draw, cx+230, cy+15, 20, 4)
    # Tail with club
    thick_line(draw, [cx-230, cy+60, cx-450, cy+100], width=10)
    draw.ellipse((cx-500, cy+70, cx-420, cy+150), outline=BLACK, width=8)
    # Spikes on club
    for i in range(4):
        angle = i * 90 + 30
        sx = cx-460 + 45 * math.cos(math.radians(angle))
        sy = cy+110 + 45 * math.sin(math.radians(angle))
        draw.polygon([(sx-5, sy), (sx-15, sy-20), (sx, sy), (sx-15, sy+20)], outline=BLACK, width=5)
    # Legs
    thick_line(draw, [cx-150, cy+130, cx-150, cy+320], width=12)
    thick_line(draw, [cx-50, cy+130, cx-50, cy+320], width=12)
    thick_line(draw, [cx+50, cy+120, cx+50, cy+310], width=12)
    thick_line(draw, [cx+140, cy+100, cx+140, cy+280], width=12)
    # Ground
    thick_line(draw, [100, cy+340, W-100, cy+340], width=6)
    return save_page(img, "06-ankilosauro.png")

def page_07_parasaurolophus():
    """Parasaurolophus — long crest on head"""
    img, draw = setup_page("Parasaurolophus")
    cx, cy = W//2, H//2
    # Body
    thick_ellipse(draw, (cx-200, cy-80, cx+180, cy+200), width=10)
    # Head
    thick_ellipse(draw, (cx+160, cy-150, cx+260, cy-30), width=8)
    # Crest (long tube backward)
    thick_line(draw, [cx+180, cy-150, cx+80, cy-300, cx+40, cy-320], width=8)
    thick_line(draw, [cx+200, cy-130, cx+100, cy-280, cx+60, cy-300], width=8)
    thick_line(draw, [cx+40, cy-320, cx+60, cy-300], width=8)
    # Eye
    eye(draw, cx+210, cy-100, 18)
    # Smile
    smile(draw, cx+210, cy-65, 25, 5)
    # Tail
    thick_line(draw, [cx-180, cy+100, cx-400, cy+200, cx-430, cy+220], width=10)
    # Arms (two legs, walks on 4 but shown standing)
    thick_line(draw, [cx-120, cy+180, cx-120, cy+400], width=12)
    thick_line(draw, [cx-40, cy+180, cx-40, cy+400], width=12)
    thick_line(draw, [cx+60, cy+170, cx+60, cy+380], width=12)
    thick_line(draw, [cx+150, cy+150, cx+150, cy+350], width=12)
    # Belly
    thick_arc(draw, (cx-150, cy+20, cx+150, cy+170), 0, 180, width=6)
    # Ground
    thick_line(draw, [100, cy+420, W-100, cy+420], width=6)
    return save_page(img, "07-parasaurolofo.png")

def page_08_plesiosaurus():
    """Plesiosaurus — marine reptile, long neck, flippers"""
    img, draw = setup_page("Plesiosaurus")
    cx, cy = W//2, H//2 - 50
    # Water surface line
    thick_line(draw, [100, cy+150, W-100, cy+150], width=4)
    # Body
    thick_ellipse(draw, (cx-150, cy-80, cx+150, cy+100), width=10)
    # Long neck (curved)
    thick_line(draw, [cx+100, cy-40, cx+200, cy-200, cx+250, cy-280, cx+280, cy-320], width=10)
    # Head
    thick_ellipse(draw, (cx+250, cy-360, cx+340, cy-280), width=8)
    # Eye
    eye(draw, cx+290, cy-330, 16)
    # Smile
    smile(draw, cx+290, cy-300, 20, 4)
    # Flippers
    thick_line(draw, [cx-100, cy+10, cx-200, cy+80, cx-220, cy+60], width=10)
    thick_line(draw, [cx+100, cy+10, cx+200, cy+80, cx+220, cy+60], width=10)
    thick_line(draw, [cx-80, cy+20, cx-180, cy+100, cx-200, cy+80], width=10)
    thick_line(draw, [cx+80, cy+20, cx+180, cy+100, cx+200, cy+80], width=10)
    # Tail
    thick_line(draw, [cx-130, cy+20, cx-280, cy+40], width=8)
    # Water waves
    for wx in range(200, W-100, 150):
        thick_arc(draw, (wx-40, cy+160, wx+40, cy+200), 0, 180, width=4)
    return save_page(img, "08-plesiosauro.png")

def page_09_velociraptor():
    """Velociraptor — running, claw"""
    img, draw = setup_page("Velociraptor")
    cx, cy = W//2, H//2
    # Body (sleek)
    thick_ellipse(draw, (cx-180, cy-80, cx+150, cy+150), width=10)
    # Head
    thick_ellipse(draw, (cx+130, cy-180, cx+230, cy-50), width=8)
    # Eye
    eye(draw, cx+180, cy-140, 18)
    # Smile
    smile(draw, cx+180, cy-105, 20, 4)
    # Teeth
    for dx in [-20, 0, 20]:
        draw.polygon([(cx+180+dx, cy-85), (cx+185+dx, cy-95), (cx+190+dx, cy-85)], fill=BLACK)
    # Tail (straight, stiff)
    thick_line(draw, [cx-160, cy+50, cx-400, cy-20], width=10)
    # Arms (with claws)
    thick_line(draw, [cx+80, cy-20, cx+140, cy+20], width=6)
    thick_line(draw, [cx+140, cy+20, cx+155, cy+30], width=5)
    # Legs (dynamic, running)
    thick_line(draw, [cx-80, cy+130, cx-60, cy+300, cx-160, cy+350], width=10)
    thick_line(draw, [cx+50, cy+130, cx+100, cy+280, cx+40, cy+370], width=10)
    # Big claw on foot
    draw.polygon([(cx-160, cy+350), (cx-180, cy+340), (cx-190, cy+360)], outline=BLACK, width=5)
    draw.polygon([(cx+40, cy+370), (cx+20, cy+360), (cx+10, cy+380)], outline=BLACK, width=5)
    # Ground
    thick_line(draw, [100, cy+390, W-100, cy+390], width=6)
    # Speed lines
    for lx in range(cx+200, cx+400, 40):
        thick_line(draw, [lx, cy-30, lx, cy+30], width=3)
    return save_page(img, "09-velociraptor.png")

def page_10_dino_baby():
    """Baby dinosaur — hatching from egg"""
    img, draw = setup_page("Baby Dino")
    cx, cy = W//2, H//2 - 50
    # Broken egg shell (bottom)
    thick_arc(draw, (cx-150, cy-50, cx+150, cy+200), 0, 180, width=8)
    # Egg shell cracks
    thick_line(draw, [cx-50, cy+75, cx-40, cy+130, cx-60, cy+160], width=6)
    thick_line(draw, [cx+30, cy+75, cx+50, cy+140], width=6)
    # Baby body
    thick_ellipse(draw, (cx-80, cy-80, cx+80, cy+60), width=8)
    # Baby head (bigger for cuteness)
    thick_ellipse(draw, (cx-70, cy-200, cx+70, cy-80), width=8)
    # Eyes (big, cute)
    eye(draw, cx-30, cy-155, 20)
    eye(draw, cx+30, cy-155, 20)
    # Big smile
    smile(draw, cx, cy-120, 35, 5)
    # Tiny arms
    thick_line(draw, [cx-60, cy-10, cx-100, cy+20], width=6)
    thick_line(draw, [cx+60, cy-10, cx+100, cy+20], width=6)
    # Spikes on head
    for sx in [-40, 0, 40]:
        draw.polygon([(cx+sx-8, cy-200), (cx+sx, cy-230), (cx+sx+8, cy-200)], fill=BLACK)
    # Tail peeking from egg
    thick_line(draw, [cx+70, cy+20, cx+130, cy+50], width=6)
    # Ground
    thick_line(draw, [200, cy+230, W-200, cy+230], width=6)
    # Small flowers
    for fx, fy in [(400, cy+200), (2100, cy+210), (250, cy+210)]:
        draw.ellipse((fx-15, fy-15, fx+15, fy+15), outline=BLACK, width=4)
        draw.ellipse((fx-5, fy-25, fx+5, fy-15), outline=BLACK, width=3)
    return save_page(img, "10-baby-dino.png")

def page_11_dino_friends():
    """Two dinos being friends (T-Rex + Triceratops)"""
    img, draw = setup_page("Dino Friends")
    cx, cy = W//2, H//2
    # Left: small T-Rex
    thick_ellipse(draw, (cx-350, cy-50, cx-150, cy+150), width=8)
    thick_ellipse(draw, (cx-320, cy-250, cx-160, cy-70), width=8)
    eye(draw, cx-220, cy-180, 18)
    smile(draw, cx-220, cy-140, 25, 4)
    thick_line(draw, [cx-330, cy+100, cx-330, cy+250], width=8)
    thick_line(draw, [cx-200, cy+100, cx-200, cy+250], width=8)
    thick_line(draw, [cx-250, cy-50, cx-210, cy+20], width=5)
    # Right: small Triceratops
    thick_ellipse(draw, (cx+150, cy-50, cx+350, cy+150), width=8)
    thick_ellipse(draw, (cx+160, cy-250, cx+320, cy-70), width=8)
    thick_arc(draw, (cx+140, cy-350, cx+340, cy-100), 180, 360, width=6)
    eye(draw, cx+220, cy-180, 18)
    smile(draw, cx+220, cy-140, 25, 4)
    thick_line(draw, [cx+190, cy-250, cx+170, cy-340], width=6)
    thick_line(draw, [cx+240, cy-250, cx+240, cy-360], width=6)
    thick_line(draw, [cx+290, cy-250, cx+310, cy-340], width=6)
    thick_line(draw, [cx+180, cy+100, cx+180, cy+250], width=8)
    thick_line(draw, [cx+300, cy+100, cx+300, cy+250], width=8)
    # Hearts between them
    for hx, hy in [(cx-30, cy-100), (cx+10, cy-140)]:
        draw.polygon([(hx, hy-15), (hx-15, hy), (hx, hy+15), (hx+15, hy)], outline=BLACK, width=4)
    # Ground
    thick_line(draw, [100, cy+270, W-100, cy+270], width=6)
    return save_page(img, "11-dino-amici.png")

def page_12_dino_eating():
    """Dinosaur eating leaves"""
    img, draw = setup_page("Dino Eating")
    cx, cy = W//2, H//2
    # Brachiosaurus head and neck
    thick_line(draw, [cx, cy+200, cx+50, cy-100, cx+30, cy-250, cx+80, cy-300], width=12)
    thick_ellipse(draw, (cx+50, cy-350, cx+200, cy-250), width=8)
    eye(draw, cx+100, cy-310, 18)
    smile(draw, cx+100, cy-280, 25, 4)
    # Tree
    thick_line(draw, [cx+400, cy+200, cx+400, cy-300], width=12)
    # Tree top (leaves)
    for lcx, lcy in [(cx+350, cy-350), (cx+450, cy-350), (cx+400, cy-420),
                     (cx+360, cy-300), (cx+440, cy-300)]:
        thick_arc(draw, (lcx-40, lcy-30, lcx+40, lcy+30), 0, 360, width=5)
    # Leaves being eaten (near mouth)
    for lx, ly in [(cx+220, cy-300), (cx+240, cy-270), (cx+250, cy-290)]:
        draw.ellipse((lx-8, ly-8, lx+8, ly+8), outline=BLACK, width=3)
    # Ground
    thick_line(draw, [100, cy+220, W-100, cy+220], width=6)
    return save_page(img, "12-dino-mangia.png")

def page_13_dino_sleeping():
    """Dinosaur sleeping, ZZZ"""
    img, draw = setup_page("Dino Sleeping")
    cx, cy = W//2, H//2 + 50
    # Body (curled up)
    thick_ellipse(draw, (cx-250, cy-80, cx+150, cy+150), width=10)
    # Head resting
    thick_ellipse(draw, (cx-220, cy-180, cx-100, cy-50), width=8)
    # Closed eye (curved line)
    thick_arc(draw, (cx-185, cy-140, cx-145, cy-110), 0, 180, width=5)
    # Smile
    smile(draw, cx-160, cy-100, 20, 4)
    # Tail curled around
    thick_line(draw, [cx+130, cy+60, cx+300, cy-50, cx+280, cy-150], width=10)
    # Legs tucked
    thick_line(draw, [cx-100, cy+130, cx-80, cy+200], width=10)
    thick_line(draw, [cx+0, cy+130, cx+20, cy+190], width=10)
    # ZZZ
    for zx, zy, sz in [(cx+150, cy-250, 30), (cx+210, cy-310, 50), (cx+280, cy-380, 70)]:
        thick_line(draw, [zx, zy, zx+sz, zy], width=5)
        thick_line(draw, [zx+sz, zy, zx+sz//2, zy+int(sz*0.7)], width=5)
        thick_line(draw, [zx+sz//2, zy+int(sz*0.7), zx+sz, zy+int(sz*0.7)], width=5)
    # Moon
    thick_arc(draw, (cx+600, cy-500, cx+750, cy-350), 0, 360, width=6)
    draw.arc((cx+610, cy-490, cx+740, cy-360), 0, 360, fill=WHITE, width=6)
    # Stars
    for sx, sy in [(cx+400, cy-400), (cx+500, cy-350), (cx+650, cy-300), (cx+800, cy-420)]:
        thick_line(draw, [sx, sy-15, sx, sy+15], width=3)
        thick_line(draw, [sx-12, sy, sx+12, sy], width=3)
    # Ground
    thick_line(draw, [100, cy+170, W-100, cy+170], width=6)
    return save_page(img, "13-dino-dorme.png")

def page_14_dino_jungle():
    """Dinosaur in jungle with plants"""
    img, draw = setup_page("Dino Jungle")
    cx, cy = W//2, H//2
    # Stegosaurus in center
    thick_ellipse(draw, (cx-180, cy-60, cx+150, cy+150), width=10)
    thick_ellipse(draw, (cx+120, cy-30, cx+220, cy+60), width=8)
    eye(draw, cx+170, cy+5, 18)
    smile(draw, cx+170, cy+30, 20, 4)
    # Plates
    for px in range(cx-140, cx+100, 35):
        draw.polygon([(px-15, cy-60), (px, cy-130), (px+15, cy-60)], outline=BLACK, width=6)
    thick_line(draw, [cx-160, cy+100, cx-160, cy+280], width=10)
    thick_line(draw, [cx-60, cy+100, cx-60, cy+280], width=10)
    thick_line(draw, [cx+40, cy+100, cx+40, cy+280], width=10)
    thick_line(draw, [cx+130, cy+80, cx+130, cy+260], width=10)
    # Jungle plants
    for px, py in [(200, cy+100), (2300, cy+80), (150, cy+50), (2400, cy+150)]:
        # Stem
        thick_line(draw, [px, cy+300, px, py], width=6)
        # Leaves
        for lx, ly in [(px-30, py+40), (px+30, py+20), (px-20, py-20), (px+25, py+60)]:
            draw.ellipse((lx-15, ly-8, lx+15, ly+8), outline=BLACK, width=4)
    # Ground
    thick_line(draw, [50, cy+300, W-50, cy+300], width=6)
    # Ferns
    for fx in [500, 800, 1700, 2000]:
        thick_line(draw, [fx, cy+300, fx-30, cy+240], width=4)
        thick_line(draw, [fx, cy+300, fx+30, cy+240], width=4)
        for i in range(-30, 35, 10):
            draw.ellipse((fx+i-6, cy+250-8, fx+i+6, cy+250+8), outline=BLACK, width=3)
    return save_page(img, "14-dino-giungla.png")

def page_15_dino_balloon():
    """Dino holding a balloon"""
    img, draw = setup_page("Dino Balloon")
    cx, cy = W//2, H//2 + 50
    # T-Rex body
    thick_ellipse(draw, (cx-150, cy-60, cx+150, cy+180), width=10)
    thick_ellipse(draw, (cx+100, cy-300, cx+250, cy-80), width=10)
    eye(draw, cx+160, cy-220, 22)
    eye(draw, cx+210, cy-220, 22)
    smile(draw, cx+185, cy-150, 30, 5)
    # Teeth
    for dx in [-25, 5, 35]:
        draw.polygon([(cx+185+dx, cy-130), (cx+190+dx, cy-145), (cx+195+dx, cy-130)], fill=BLACK)
    thick_line(draw, [cx-60, cy+160, cx-60, cy+350], width=12)
    thick_line(draw, [cx+60, cy+160, cx+60, cy+350], width=12)
    # Arm holding balloon string
    thick_line(draw, [cx+120, cy-60, cx+70, cy-120], width=6)
    # Balloon string
    thick_line(draw, [cx+70, cy-120, cx+70, cy-350], width=3)
    # Balloon
    thick_ellipse(draw, (cx+10, cy-500, cx+130, cy-350), width=8)
    # Balloon highlight
    thick_arc(draw, (cx+30, cy-480, cx+80, cy-420), 180, 360, width=4)
    # Balloon knot
    draw.polygon([(cx+60, cy-345), (cx+70, cy-335), (cx+80, cy-345)], outline=BLACK, width=4)
    # Ground
    thick_line(draw, [100, cy+370, W-100, cy+370], width=6)
    return save_page(img, "15-dino-palloncino.png")

def page_16_dino_fish():
    """Dino fishing — Plesiosaurus catching fish"""
    img, draw = setup_page("Dino Fishing")
    cx, cy = W//2, H//2
    # Water
    thick_line(draw, [50, cy+100, W-50, cy+100], width=4)
    # Plesiosaurus body
    thick_ellipse(draw, (cx-120, cy-20, cx+120, cy+80), width=8)
    thick_line(draw, [cx+80, cy-10, cx+150, cy-100], width=8)
    thick_ellipse(draw, (cx+130, cy-140, cx+180, cy-90), width=7)
    eye(draw, cx+160, cy-120, 12)
    smile(draw, cx+160, cy-105, 12, 3)
    thick_line(draw, [cx-100, cy+20, cx-180, cy+60], width=8)
    thick_line(draw, [cx+100, cy+20, cx+180, cy+60], width=8)
    # Fish jumping out
    thick_ellipse(draw, (cx-200, cy-220, cx-130, cy-150), width=6)
    eye(draw, cx-155, cy-195, 8)
    # Fish tail
    draw.polygon([(cx-130, cy-185), (cx-100, cy-200), (cx-100, cy-170)], outline=BLACK, width=4)
    # Water splashes
    for sx in [cx-250, cx-220, cx-190, cx-160]:
        draw.ellipse((sx-10, cy+80, sx+10, cy+100), outline=BLACK, width=3)
    # Water waves
    for wx in range(100, W-100, 120):
        thick_arc(draw, (wx-30, cy+110, wx+30, cy+140), 0, 180, width=3)
    return save_page(img, "16-dino-pesca.png")

def page_17_dino_rainbow():
    """Dino with rainbow"""
    img, draw = setup_page("Dino Rainbow")
    cx, cy = W//2, H//2 + 150
    # Rainbow
    for i, (r, g, b) in enumerate([(255,0,0), (255,165,0), (255,255,0), (0,200,0), (0,0,255), (128,0,255)]):
        offset = i * 15
        draw.arc((cx-600+offset, cy-600+offset, cx+600-offset, cy-offset),
                 180, 360, fill=(r,g,b), width=10)
    # Dino (small Brachiosaurus)
    thick_ellipse(draw, (cx-120, cy-50, cx+100, cy+100), width=8)
    thick_line(draw, [cx+60, cy-30, cx+100, cy-200, cx+80, cy-240], width=10)
    thick_ellipse(draw, (cx+60, cy-280, cx+120, cy-220), width=7)
    eye(draw, cx+85, cy-255, 12)
    smile(draw, cx+85, cy-240, 12, 3)
    thick_line(draw, [cx-80, cy+80, cx-80, cy+180], width=10)
    thick_line(draw, [cx+0, cy+80, cx+0, cy+180], width=10)
    thick_line(draw, [cx+60, cy+60, cx+60, cy+160], width=10)
    thick_line(draw, [cx-100, cy+50, cx-200, cy], width=8)
    # Clouds at rainbow ends
    for c2x, c2y in [(500, 520), (2050, 520)]:
        thick_arc(draw, (c2x-50, c2y-30, c2x+50, c2y+30), 0, 360, width=5)
        thick_arc(draw, (c2x-15, c2y-50, c2x+65, c2y+15), 0, 360, width=5)
    # Ground
    thick_line(draw, [50, cy+200, W-50, cy+200], width=6)
    return save_page(img, "17-dino-arcobaleno.png")

def page_18_dino_maze():
    """Simple dinosaur maze / labyrinth"""
    img, draw = setup_page("Dino Maze")
    cx, cy = W//2, H//2
    # Title area
    # Dino head at start
    thick_ellipse(draw, (cx-550, cy-250, cx-450, cy-150), width=6)
    eye(draw, cx-510, cy-210, 12)
    smile(draw, cx-510, cy-190, 10, 3)
    # Simple maze: thick walls
    walls = [
        (300, cy-100, cx-100, cy-100),  # top-left horizontal
        (cx-100, cy-100, cx-100, cy+50),
        (cx-100, cy+50, cx+100, cy+50),
        (cx+100, cy+50, cx+100, cy-50),
        (cx+100, cy-50, W-300, cy-50),
        (300, cy+50, 300, cy+150),
        (W-300, cy-50, W-300, cy+100),
        (200, cy+150, 600, cy+150),
        (800, cy+150, 1200, cy+150),
        (1500, cy+150, W-200, cy+150),
    ]
    for x1, y1, x2, y2 in walls:
        thick_line(draw, [x1, y1, x2, y2], width=10)
    
    # Path dots (for following the right path)
    path_dots = [
        (350, cy-60), (450, cy-60), (550, cy-60), (650, cy-60),
        (650, cy), (550, cy), (450, cy), (350, cy+20),
        (350, cy+110), (500, cy+110), (700, cy+110), (850, cy+110),
        (850, cy), (950, cy), (1050, cy), 
        (1050, cy+110), (1200, cy+110), (1400, cy+110), (1600, cy+110),
    ]
    for dx, dy in path_dots:
        draw.ellipse((dx-6, dy-6, dx+6, dy+6), fill=(200,200,200))
    
    # Goal: dinosaur nest with eggs
    thick_arc(draw, (W-350, cy+100, W-150, cy+200), 0, 180, width=6)
    for ex, ey in [(W-270, cy+140), (W-230, cy+145), (W-250, cy+120)]:
        thick_ellipse(draw, (ex-15, ey-10, ex+15, ey+10), width=4)
    # Star at goal
    thick_line(draw, [W-250, cy+230, W-250, cy+260], width=4)
    thick_line(draw, [W-265, cy+245, W-235, cy+245], width=4)
    
    # Instructions
    # Ground
    thick_line(draw, [100, cy+300, W-100, cy+300], width=4)
    return save_page(img, "18-dino-labirinto.png")

def page_19_dino_hat():
    """Dinosaur wearing a party hat"""
    img, draw = setup_page("Dino Party")
    cx, cy = W//2, H//2 - 50
    # Triceratops body
    thick_ellipse(draw, (cx-180, cy-50, cx+180, cy+200), width=10)
    thick_ellipse(draw, (cx-100, cy-250, cx+100, cy-50), width=8)
    thick_arc(draw, (cx-160, cy-370, cx+160, cy-70), 180, 360, width=7)
    # Party hat
    draw.polygon([(cx-40, cy-250), (cx, cy-420), (cx+40, cy-250)], outline=BLACK, width=6)
    # Hat stripes
    thick_line(draw, [cx-25, cy-300, cx+25, cy-300], width=4)
    thick_line(draw, [cx-15, cy-350, cx+15, cy-350], width=4)
    # Pompom
    thick_line(draw, [cx, cy-420, cx, cy-440], width=4)
    draw.ellipse((cx-10, cy-455, cx+10, cy-435), fill=BLACK)
    # Eyes
    eye(draw, cx-40, cy-180, 20)
    eye(draw, cx+40, cy-180, 20)
    # Smile
    smile(draw, cx, cy-130, 35, 5)
    # Party blower
    thick_line(draw, [cx+80, cy-120, cx+180, cy-140], width=5)
    # Confetti
    for conf in [(400, 200), (2100, 180), (500, 300), (2000, 250), (450, 400), (1900, 350)]:
        draw.ellipse((conf[0]-8, conf[1]-5, conf[0]+8, conf[1]+5), outline=BLACK, width=3)
    # Legs
    thick_line(draw, [cx-80, cy+180, cx-80, cy+380], width=12)
    thick_line(draw, [cx+80, cy+180, cx+80, cy+380], width=12)
    # Ground
    thick_line(draw, [100, cy+400, W-100, cy+400], width=6)
    return save_page(img, "19-dino-festa.png")

def page_20_dino_family():
    """Dinosaur family — parent and child"""
    img, draw = setup_page("Dino Family")
    cx, cy = W//2, H//2 + 50
    # Parent (big, left)
    thick_ellipse(draw, (cx-350, cy-80, cx-50, cy+150), width=10)
    thick_ellipse(draw, (cx-330, cy-280, cx-150, cy-100), width=10)
    eye(draw, cx-230, cy-210, 22)
    eye(draw, cx-270, cy-210, 22)
    smile(draw, cx-250, cy-150, 30, 5)
    thick_line(draw, [cx-300, cy+130, cx-300, cy+300], width=12)
    thick_line(draw, [cx-150, cy+130, cx-150, cy+300], width=12)
    thick_line(draw, [cx-250, cy-100, cx-200, cy-30], width=6)
    
    # Child (small, right)
    thick_ellipse(draw, (cx+100, cy-40, cx+280, cy+100), width=8)
    thick_ellipse(draw, (cx+120, cy-180, cx+230, cy-60), width=8)
    eye(draw, cx+170, cy-140, 18)
    eye(draw, cx+200, cy-140, 18)
    smile(draw, cx+185, cy-100, 20, 4)
    thick_line(draw, [cx+140, cy+80, cx+140, cy+200], width=8)
    thick_line(draw, [cx+230, cy+80, cx+230, cy+200], width=8)
    thick_line(draw, [cx+170, cy-40, cx+210, cy+10], width=5)
    
    # Hearts
    for hx, hy in [(cx-10, cy-100), (cx+40, cy-50)]:
        draw.polygon([(hx, hy-12), (hx-12, hy+3), (hx, hy+12), (hx+12, hy+3)], outline=BLACK, width=4)
    
    # Ground
    thick_line(draw, [50, cy+320, W-50, cy+320], width=6)
    return save_page(img, "20-dino-famiglia.png")


# ============ GENERATE ALL ============

if __name__ == "__main__":
    pages = [
        page_01_trex,
        page_02_triceratops,
        page_03_stegosaurus,
        page_04_brachiosaurus,
        page_05_pterodactyl,
        page_06_ankylosaurus,
        page_07_parasaurolophus,
        page_08_plesiosaurus,
        page_09_velociraptor,
        page_10_dino_baby,
        page_11_dino_friends,
        page_12_dino_eating,
        page_13_dino_sleeping,
        page_14_dino_jungle,
        page_15_dino_balloon,
        page_16_dino_fish,
        page_17_dino_rainbow,
        page_18_dino_maze,
        page_19_dino_hat,
        page_20_dino_family,
    ]
    
    files = []
    for i, page_fn in enumerate(pages, 1):
        print(f"Generating page {i:02d}/20...")
        path = page_fn()
        files.append(path)
        print(f"  -> Saved: {path}")
    
    print(f"\n✅ Done! Generated {len(files)} coloring pages.")
