#!/usr/bin/env python3
"""Rebuild Notion version history page - fast version."""

import requests
import sys

API_KEY = "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"
PAGE_ID = "300330c2-8646-8102-84ce-d2f75f15d5fa"
BASE_URL = "http://95.217.8.116:8800/mission/cards"
HEADERS = {
    "Authorization": f"Bearer {API_KEY}",
    "Notion-Version": "2022-06-28",
    "Content-Type": "application/json"
}

def delete_blocks_batch():
    """Delete blocks in one pass."""
    url = f"https://api.notion.com/v1/blocks/{PAGE_ID}/children?page_size=100"
    resp = requests.get(url, headers=HEADERS)
    if resp.status_code != 200:
        print(f"Error fetching: {resp.text}")
        return
    data = resp.json()
    blocks = data.get("results", [])
    print(f"Found {len(blocks)} blocks to delete")
    for block in blocks:
        del_url = f"https://api.notion.com/v1/blocks/{block['id']}"
        r = requests.delete(del_url, headers=HEADERS)
        print(".", end="", flush=True)
    print(f"\nDeleted {len(blocks)} blocks")
    return len(blocks)

def rich_text(text, bold=False, color="default"):
    return {
        "type": "text",
        "text": {"content": text},
        "annotations": {"bold": bold, "italic": False, "strikethrough": False, "underline": False, "code": False, "color": color}
    }

def h2(text):
    return {"object": "block", "type": "heading_2", "heading_2": {"rich_text": [rich_text(text)]}}

def h3(text):
    return {"object": "block", "type": "heading_3", "heading_3": {"rich_text": [rich_text(text)]}}

def p(texts):
    return {"object": "block", "type": "paragraph", "paragraph": {"rich_text": [rich_text(t, b, c) for t, b, c in texts]}}

def callout(texts, emoji="📝", bg="gray_background"):
    return {"object": "block", "type": "callout", "callout": {"rich_text": [rich_text(t, b, c) for t, b, c in texts], "icon": {"type": "emoji", "emoji": emoji}, "color": bg}}

def img(url):
    return {"object": "block", "type": "image", "image": {"type": "external", "external": {"url": url}}}

def div():
    return {"object": "block", "type": "divider", "divider": {}}

def bul(text):
    return {"object": "block", "type": "bulleted_list_item", "bulleted_list_item": {"rich_text": [rich_text(text)]}}

def append(blocks):
    url = f"https://api.notion.com/v1/blocks/{PAGE_ID}/children"
    for i in range(0, len(blocks), 100):
        batch = blocks[i:i+100]
        resp = requests.patch(url, headers=HEADERS, json={"children": batch})
        if resp.status_code != 200:
            print(f"Error: {resp.status_code} {resp.text[:200]}")
        else:
            print(f"Added batch {i//100 + 1}")

def build():
    b = []
    b.append(callout([("Mission Family Illustrations - Version History", False, "default")], "📋", "blue_background"))
    b.append(p([("Each version: prompt (", False, "default"), ("NEW in blue bold", True, "blue"), ("), images, prompt vs result.", False, "default")]))
    b.append(div())
    
    b.append(h2("Character Specs (LOCKED)"))
    b.append(bul("Dad: 50s, short gray hair, TRIM gray beard, rosy cheeks"))
    b.append(bul("Mom: 30s, brown ponytail, rosy cheeks"))
    b.append(bul("Daughter: 5yo, blonde bob, rosy cheeks"))
    b.append(div())
    
    # V1
    b.append(h2("V1 - TARGET REFERENCE ✅"))
    b.append(h3("Prompt"))
    b.append(callout([("Original reference - prompt unknown. APPROVED style target.", False, "default")], "🎯", "green_background"))
    b.append(h3("Images"))
    b.append(img(f"{BASE_URL}/scene_beach_lotion.png"))
    b.append(h3("Key Style"))
    b.append(bul("BLACK line work • FLAT solid colors • NO gradients"))
    b.append(div())
    
    # V2
    b.append(h2("V2 - Too Cartoonish ❌"))
    b.append(h3("Prompt"))
    b.append(callout([("Cartoon style. ", False, "default"), ("Added '5% more cartoonish'", True, "blue")], "📝", "gray_background"))
    b.append(h3("Images"))
    b.append(img(f"{BASE_URL}/scene_beach_v2.png"))
    b.append(h3("Prompt vs Result"))
    b.append(p([("❌ Lost European BD quality → generic cartoon", False, "default")]))
    b.append(div())
    
    # V3
    b.append(h2("V3 - Too Serious ❌"))
    b.append(h3("Prompt"))
    b.append(callout([("European graphic novel. ", False, "default"), ("'editorial realism', 'realistic proportions', 'watercolor-like'", True, "blue")], "📝", "gray_background"))
    b.append(h3("Images"))
    b.append(img(f"{BASE_URL}/scene_beach_v3.png"))
    b.append(img(f"{BASE_URL}/scene_hike_v3.png"))
    b.append(img(f"{BASE_URL}/scene_ski_v3.png"))
    b.append(h3("Prompt vs Result"))
    b.append(p([("❌ Too serious, lost warmth. 'Editorial realism' overcorrects.", False, "default")]))
    b.append(div())
    
    # V4
    b.append(h2("V4 - Good But Not Yet ⚠️"))
    b.append(h3("Prompt"))
    b.append(callout([("Simple ", False, "default"), ("warm cartoon", True, "blue"), (" illustration. ", False, "default"), ("Black line art, flat colors, line work background", True, "blue"), (". ", False, "default"), ("Children's book, simple faces, small eyes", True, "blue"), (". NOT realistic.", False, "default")], "📝", "gray_background"))
    b.append(h3("Images"))
    b.append(img(f"{BASE_URL}/scene_beach_v4.png"))
    b.append(img(f"{BASE_URL}/scene_hike_v4.png"))
    b.append(img(f"{BASE_URL}/scene_ski_v4.png"))
    b.append(h3("Prompt vs Result"))
    b.append(p([("✅ Warmer feel. ⚠️ Color saturation still off.", False, "default")]))
    b.append(div())
    
    # V5
    b.append(h2("V5 - Too Muted ❌"))
    b.append(h3("Prompt"))
    b.append(callout([("Hand-drawn style. ", False, "default"), ("Bold varied line weights, cross-hatching. Warm muted palette, cozy nostalgic", True, "blue")], "📝", "gray_background"))
    b.append(h3("Images"))
    b.append(img(f"{BASE_URL}/scene_beach_v5.png"))
    b.append(img(f"{BASE_URL}/scene_hike_v5.png"))
    b.append(img(f"{BASE_URL}/scene_ski_v5.png"))
    b.append(h3("Prompt vs Result"))
    b.append(p([("❌ Went sepia/earthy. 'Warm muted' → too desaturated.", False, "default")]))
    b.append(div())
    
    # V6
    b.append(h2("V6 - Too Bright ❌"))
    b.append(h3("Prompt"))
    b.append(callout([("Clean warm cartoon. ", False, "default"), ("BRIGHT flat colors - NOT muted, NOT sepia, NOT earthy", True, "blue")], "📝", "gray_background"))
    b.append(h3("Images"))
    b.append(img(f"{BASE_URL}/scene_beach_v6.png"))
    b.append(img(f"{BASE_URL}/scene_hike_v6.png"))
    b.append(img(f"{BASE_URL}/scene_ski_v6.png"))
    b.append(h3("Prompt vs Result"))
    b.append(p([("❌ Oversaturated candy colors. 'BRIGHT' overcorrects from V5.", False, "default")]))
    b.append(div())
    
    # V7
    b.append(h2("V7 - Better ⚠️"))
    b.append(h3("Prompt"))
    b.append(callout([("Clean warm cartoon. Mom in ", False, "default"), ("SOFT DUSTY CORAL", True, "blue"), (", Daughter in ", False, "default"), ("SOFT DUSTY PINK", True, "blue"), (". ", False, "default"), ("LINE WORK ONLY on cream. ONLY characters have color. Soft muted flat - NOT bright, NOT sepia", True, "blue")], "📝", "gray_background"))
    b.append(h3("Images"))
    b.append(img(f"{BASE_URL}/scene_beach_v7.png"))
    b.append(img(f"{BASE_URL}/scene_hike_v7.png"))
    b.append(img(f"{BASE_URL}/scene_ski_v7.png"))
    b.append(h3("Prompt vs Result"))
    b.append(p([("✅ Better color with 'soft dusty'. ⚠️ Not quite V1 flatness.", False, "default")]))
    b.append(div())
    
    # V8
    b.append(h2("V8 - Still Has Gradients ❌"))
    b.append(h3("Prompt"))
    b.append(callout([("European children book. ", False, "default"), ("WARM SEPIA-BROWN ink lines (NOT black). Warm peachy skin. UNCOLORED WARM BROWN LINE ART", True, "blue")], "📝", "gray_background"))
    b.append(h3("Images"))
    b.append(img(f"{BASE_URL}/scene_beach_v8.png"))
    b.append(img(f"{BASE_URL}/scene_hike_v8.png"))
    b.append(img(f"{BASE_URL}/scene_ski_v8.png"))
    b.append(h3("Prompt vs Result"))
    b.append(p([("❌ Got watercolor gradients instead of flat fills.", False, "default")]))
    b.append(callout([("🚨 V1 REANALYSIS: Lines are BLACK (not sepia). Colors are COMPLETELY FLAT.", False, "default")], "🚨", "red_background"))
    b.append(div())
    
    # V9
    b.append(h2("V9 - Flat Colors, 4 New Situations"))
    b.append(h3("Prompt"))
    b.append(callout([("Simple ", False, "default"), ("flat vector illustration, clean BLACK line art, FLAT solid color fills, NO gradients NO shading NO watercolor", True, "blue"), (". Background as ", False, "default"), ("BLACK LINE ART ONLY. ONLY people have FLAT solid colors", True, "blue")], "📝", "gray_background"))
    b.append(h3("Images"))
    b.append(img(f"{BASE_URL}/scene_airport_v9.png"))
    b.append(img(f"{BASE_URL}/scene_grocery_v9.png"))
    b.append(img(f"{BASE_URL}/scene_kite_v9.png"))
    b.append(img(f"{BASE_URL}/scene_restaurant_v9.png"))
    b.append(h3("Prompt vs Result"))
    b.append(p([("⏸️ Awaiting review", False, "default")]))
    b.append(div())
    
    # Summary
    b.append(h2("📊 Color Spectrum"))
    b.append(callout([("TOO MUTED (V5) ← TARGET (V1: flat dusty) → TOO BRIGHT (V6)", False, "default")], "🎨", "yellow_background"))
    b.append(h2("30% Color Rule"))
    b.append(p([("ONLY characters get color. Backgrounds = BLACK LINE WORK on cream.", False, "default")]))
    
    return b

if __name__ == "__main__":
    print("Step 1: Deleting existing blocks...")
    count = delete_blocks_batch()
    while count and count > 0:
        count = delete_blocks_batch()
    
    print("\nStep 2: Building new content...")
    blocks = build()
    print(f"Created {len(blocks)} blocks")
    
    print("\nStep 3: Appending to Notion...")
    append(blocks)
    print("\nDone!")
