#!/bin/bash
# Basic PowerPoint shapes — geometries, fills, outlines, effects, rotation, opacity.
# Demonstrates: --type shape with geometry preset, solid/gradient/pattern/image fills,
# line styling (color/width/dash/arrowheads), rotation, opacity, shadow effects.

# NOTE: intentionally NO `set -e`. Like the SDK twin's doc.batch, this script
# tolerates forward-compat 'UNSUPPORTED props' warnings (officecli exit 2) and
# keeps building so the full document is produced.
DIR="$(dirname "$0")"
PPTX="$DIR/shapes-basic.pptx"

rm -f "$PPTX"
officecli create "$PPTX"
officecli open "$PPTX"

# ─────────────────────────────────────────────────────────────────────────────
# Slide 1 — Geometry preset gallery
# ─────────────────────────────────────────────────────────────────────────────
officecli add "$PPTX" / --type slide
officecli add "$PPTX" '/slide[1]' --type shape \
    --prop text="Geometry Presets" --prop size=28 --prop bold=true \
    --prop x=0.5in --prop y=0.3in --prop width=12in --prop height=0.6in

# Row of 8 shapes, one per supported preset.
# Schema-declared presets: rect, roundRect, ellipse, triangle, diamond,
# parallelogram, rightArrow, star5
COL=0
for preset in rect roundRect ellipse triangle diamond parallelogram rightArrow star5; do
    X=$(echo "0.5 + $COL * 1.55" | bc -l)
    officecli add "$PPTX" '/slide[1]' --type shape \
        --prop geometry="$preset" \
        --prop x="${X}in" --prop y=1.5in --prop width=1.3in --prop height=1.3in \
        --prop fill=4472C4 --prop color=FFFFFF \
        --prop text="$preset" --prop size=11 --prop bold=true
    COL=$((COL + 1))
done

# ─────────────────────────────────────────────────────────────────────────────
# Slide 2 — Fill variations on the same geometry
# ─────────────────────────────────────────────────────────────────────────────
officecli add "$PPTX" / --type slide
officecli add "$PPTX" '/slide[2]' --type shape \
    --prop text="Fill Variations" --prop size=28 --prop bold=true \
    --prop x=0.5in --prop y=0.3in --prop width=12in --prop height=0.6in

# Solid hex
officecli add "$PPTX" '/slide[2]' --type shape --prop geometry=roundRect \
    --prop x=0.5in --prop y=1.3in --prop width=2.5in --prop height=1.5in \
    --prop fill=E63946 --prop color=FFFFFF --prop bold=true \
    --prop text='fill=E63946'

# Theme color (follows deck theme)
officecli add "$PPTX" '/slide[2]' --type shape --prop geometry=roundRect \
    --prop x=3.3in --prop y=1.3in --prop width=2.5in --prop height=1.5in \
    --prop fill=accent2 --prop color=FFFFFF --prop bold=true \
    --prop text='fill=accent2'

# Linear gradient (color1-color2-angle)
officecli add "$PPTX" '/slide[2]' --type shape --prop geometry=roundRect \
    --prop x=6.1in --prop y=1.3in --prop width=2.5in --prop height=1.5in \
    --prop gradient="FF6B6B-4ECDC4-45" --prop color=FFFFFF --prop bold=true \
    --prop text='gradient linear 45°'

# Radial gradient
officecli add "$PPTX" '/slide[2]' --type shape --prop geometry=roundRect \
    --prop x=8.9in --prop y=1.3in --prop width=2.5in --prop height=1.5in \
    --prop gradient="radial:FFE66D-FF6B35-center" --prop color=000000 --prop bold=true \
    --prop text='gradient radial'

# Pattern (preset:fg:bg)
officecli add "$PPTX" '/slide[2]' --type shape --prop geometry=roundRect \
    --prop x=0.5in --prop y=3.1in --prop width=2.5in --prop height=1.5in \
    --prop pattern="diagBrick:1D3557:F1FAEE" --prop color=FFFFFF --prop bold=true \
    --prop text='pattern diagBrick'

# Opacity (requires a fill to attach to)
officecli add "$PPTX" '/slide[2]' --type shape --prop geometry=roundRect \
    --prop x=3.3in --prop y=3.1in --prop width=2.5in --prop height=1.5in \
    --prop fill=2A9D8F --prop opacity=0.4 --prop color=000000 --prop bold=true \
    --prop text='fill + opacity=0.4'

# No fill (outline only)
officecli add "$PPTX" '/slide[2]' --type shape --prop geometry=roundRect \
    --prop x=6.1in --prop y=3.1in --prop width=2.5in --prop height=1.5in \
    --prop fill=none --prop line="264653:2.5:solid" --prop color=264653 --prop bold=true \
    --prop text='fill=none + outline'

# Per-stop gradient positions
officecli add "$PPTX" '/slide[2]' --type shape --prop geometry=roundRect \
    --prop x=8.9in --prop y=3.1in --prop width=2.5in --prop height=1.5in \
    --prop gradient="FF0000@0-FFD700@40-0000FF@100" --prop color=FFFFFF --prop bold=true \
    --prop text='gradient per-stop'

# ─────────────────────────────────────────────────────────────────────────────
# Slide 3 — Outline styling (line color / width / dash / caps / arrowheads)
# ─────────────────────────────────────────────────────────────────────────────
officecli add "$PPTX" / --type slide
officecli add "$PPTX" '/slide[3]' --type shape \
    --prop text="Outline Styling" --prop size=28 --prop bold=true \
    --prop x=0.5in --prop y=0.3in --prop width=12in --prop height=0.6in

# Compound line form: color:width:dash
officecli add "$PPTX" '/slide[3]' --type shape --prop geometry=rect \
    --prop x=0.5in --prop y=1.3in --prop width=3in --prop height=1.2in \
    --prop fill=none --prop line="E63946:3:solid" \
    --prop text='line="E63946:3:solid"' --prop size=12

officecli add "$PPTX" '/slide[3]' --type shape --prop geometry=rect \
    --prop x=4in --prop y=1.3in --prop width=3in --prop height=1.2in \
    --prop fill=none --prop line="1D3557:2:dash" \
    --prop text='line="1D3557:2:dash"' --prop size=12

officecli add "$PPTX" '/slide[3]' --type shape --prop geometry=rect \
    --prop x=7.5in --prop y=1.3in --prop width=3in --prop height=1.2in \
    --prop fill=none --prop line="2A9D8F:2.5:dashDot" \
    --prop text='line="2A9D8F:2.5:dashDot"' --prop size=12

# Per-attribute form: lineColor + lineWidth + lineDash
officecli add "$PPTX" '/slide[3]' --type shape --prop geometry=ellipse \
    --prop x=0.5in --prop y=2.9in --prop width=3in --prop height=1.4in \
    --prop fill=FFE66D --prop lineColor=E63946 --prop lineWidth=4pt --prop lineDash=solid \
    --prop text='separate lineColor/lineWidth/lineDash' --prop size=11

# Compound stroke (cmpd=dbl → double line)
officecli add "$PPTX" '/slide[3]' --type shape --prop geometry=ellipse \
    --prop x=4in --prop y=2.9in --prop width=3in --prop height=1.4in \
    --prop fill=A8DADC --prop lineColor=1D3557 --prop lineWidth=6pt --prop cmpd=dbl \
    --prop text='cmpd=dbl (double stroke)' --prop size=11

# Triple stroke
officecli add "$PPTX" '/slide[3]' --type shape --prop geometry=ellipse \
    --prop x=7.5in --prop y=2.9in --prop width=3in --prop height=1.4in \
    --prop fill=A8DADC --prop lineColor=1D3557 --prop lineWidth=8pt --prop cmpd=tri \
    --prop text='cmpd=tri (triple stroke)' --prop size=11

# Arrowheads on shape outlines (rightArrow already arrow-shaped — demo headEnd/tailEnd here)
officecli add "$PPTX" '/slide[3]' --type shape \
    --prop text="headEnd / tailEnd work on any outline (not just connectors):" \
    --prop size=12 \
    --prop x=0.5in --prop y=4.7in --prop width=12in --prop height=0.4in

officecli add "$PPTX" '/slide[3]' --type shape --prop geometry=rect \
    --prop x=0.5in --prop y=5.2in --prop width=4in --prop height=0.05in \
    --prop fill=none --prop lineColor=000000 --prop lineWidth=2pt \
    --prop headEnd=triangle --prop tailEnd=arrow

officecli add "$PPTX" '/slide[3]' --type shape --prop geometry=rect \
    --prop x=5in --prop y=5.2in --prop width=4in --prop height=0.05in \
    --prop fill=none --prop lineColor=000000 --prop lineWidth=2pt \
    --prop headEnd=diamond --prop tailEnd=oval

# ─────────────────────────────────────────────────────────────────────────────
# Slide 4 — Rotation, shadow effect, z-order via add order
# ─────────────────────────────────────────────────────────────────────────────
officecli add "$PPTX" / --type slide
officecli add "$PPTX" '/slide[4]' --type shape \
    --prop text="Rotation + Effects" --prop size=28 --prop bold=true \
    --prop x=0.5in --prop y=0.3in --prop width=12in --prop height=0.6in

# Rotation in degrees (0..360)
COL=0
for r in 0 30 60 90 135 180 225 270; do
    X=$(echo "0.5 + $COL * 1.55" | bc -l)
    officecli add "$PPTX" '/slide[4]' --type shape --prop geometry=rightArrow \
        --prop x="${X}in" --prop y=1.3in --prop width=1.4in --prop height=0.8in \
        --prop fill=4472C4 --prop color=FFFFFF --prop bold=true \
        --prop rotation="$r" --prop text="${r}°" --prop size=11
    COL=$((COL + 1))
done

# Shadow effect: shadow=color:blur:offset:direction (handler's compound effect)
officecli add "$PPTX" '/slide[4]' --type shape --prop geometry=roundRect \
    --prop x=1in --prop y=3in --prop width=3.5in --prop height=1.8in \
    --prop fill=E63946 --prop color=FFFFFF --prop bold=true --prop size=14 \
    --prop text='shadow=000000' \
    --prop shadow=000000

officecli add "$PPTX" '/slide[4]' --type shape --prop geometry=roundRect \
    --prop x=5.5in --prop y=3in --prop width=3.5in --prop height=1.8in \
    --prop fill=2A9D8F --prop color=FFFFFF --prop bold=true --prop size=14 \
    --prop text='glow=FFD700' \
    --prop glow=FFD700

officecli add "$PPTX" '/slide[4]' --type shape --prop geometry=roundRect \
    --prop x=10in --prop y=3in --prop width=3in --prop height=1.8in \
    --prop fill=F4A261 --prop color=000000 --prop bold=true --prop size=14 \
    --prop text='reflection=tight' \
    --prop reflection=tight

# ─────────────────────────────────────────────────────────────────────────────
# Slide 5 — Stroke geometry details (lineCap / lineJoin / lineAlign)
# ─────────────────────────────────────────────────────────────────────────────
officecli add "$PPTX" / --type slide
officecli add "$PPTX" '/slide[5]' --type shape \
    --prop text="Stroke Geometry — lineCap / lineJoin / lineAlign" \
    --prop size=28 --prop bold=true \
    --prop x=0.5in --prop y=0.3in --prop width=12in --prop height=0.6in

# lineCap — how the stroke terminates at line endpoints / dash gaps.
# Most visible with a thick dashed stroke.
X=0.5
for cap in flat round square; do
    officecli add "$PPTX" '/slide[5]' --type shape --prop geometry=rect \
        --prop x="${X}in" --prop y=1.5in --prop width=4in --prop height=0.05in \
        --prop fill=none --prop lineColor=1D3557 --prop lineWidth=10pt \
        --prop lineDash=dash --prop lineCap="$cap"
    officecli add "$PPTX" '/slide[5]' --type shape \
        --prop text="lineCap=$cap" --prop size=12 \
        --prop x="${X}in" --prop y=1.8in --prop width=4in --prop height=0.4in \
        --prop fill=none --prop line="000000:0:solid"
    X=$(echo "$X + 4.3" | bc -l)
done

# lineJoin — corner style on a stroked shape.
# Most visible on a triangle outline with thick lines.
X=0.5
for join in round bevel miter; do
    officecli add "$PPTX" '/slide[5]' --type shape --prop geometry=triangle \
        --prop x="${X}in" --prop y=2.8in --prop width=2.5in --prop height=2in \
        --prop fill=A8DADC --prop lineColor=E63946 --prop lineWidth=12pt \
        --prop lineJoin="$join"
    officecli add "$PPTX" '/slide[5]' --type shape \
        --prop text="lineJoin=$join" --prop size=12 \
        --prop x="${X}in" --prop y=4.9in --prop width=2.5in --prop height=0.4in \
        --prop fill=none --prop line="000000:0:solid"
    X=$(echo "$X + 3" | bc -l)
done

# miterLimit — caps how far a miter join's spike extends before it's clipped.
# Expressed in 1/1000ths of a percent; 800000 = 800%. Supplied as the compound
# lineJoin=miter:<lim> form which sets both join style and limit in one prop.
officecli add "$PPTX" '/slide[5]' --type shape --prop geometry=triangle \
    --prop x=0.5in --prop y=5.1in --prop width=2.5in --prop height=1.6in \
    --prop fill=A8DADC --prop lineColor=E63946 --prop lineWidth=8pt \
    --prop lineJoin="miter:800000"
officecli add "$PPTX" '/slide[5]' --type shape \
    --prop text='lineJoin="miter:800000"  (limit 800%)' --prop size=12 \
    --prop x=0.5in --prop y=6.9in --prop width=4in --prop height=0.4in \
    --prop fill=none --prop line="000000:0:solid"

# lineAlign — stroke alignment relative to the path: ctr (centered) vs in (inset).
# Same shape, same border width, only the alignment of the stroke differs.
X=8.9
for algn in ctr in; do
    officecli add "$PPTX" '/slide[5]' --type shape --prop geometry=rect \
        --prop x="${X}in" --prop y=2.8in --prop width=1.9in --prop height=2in \
        --prop fill=F4A261 --prop lineColor=1D3557 --prop lineWidth=12pt \
        --prop lineAlign="$algn"
    officecli add "$PPTX" '/slide[5]' --type shape \
        --prop text="lineAlign=$algn" --prop size=12 \
        --prop x="${X}in" --prop y=4.9in --prop width=2in --prop height=0.4in \
        --prop fill=none --prop line="000000:0:solid"
    X=$(echo "$X + 2.1" | bc -l)
done

officecli close "$PPTX"
officecli validate "$PPTX"
echo "Created: $PPTX"
