"""Storia di festa per i traguardi (primo uso: 500 follower, 26/9/2026).

    python3 codice/festa.py 500_follower foto/libreria_500.jpg "Grazie a tutti" "Siamo in 500!"

Panno verde al posto del nero (un traguardo è una festa), foto intera in una card centrata, titolo
centrato sopra, meeple colorati sparsi sui bordi (i meeple sono le persone: il numero si legge come
follower). Sotto la card resta libera la fascia per lo sticker Domanda, che Paolo aggiunge dall'app:
se c'è lo sticker, la domanda non va anche nel testo. Scrive out/storie/<nome>.png.
"""
import math, os, random, sys
import storia

# Sagoma del meeple classico, dai riferimenti di Paolo: testa a cupola, spalle larghe, braccia corte
# e tonde, gambe corte con la tacca triangolare, piedi piatti. viewBox 0 0 100 100.
MEEPLE = ("M50 1C59 1 65 8 65 17C65 19 65 20 66 21C80 24 93 30 97 40C100 47 98 54 91 54L78 54C84 68 91 82 "
          "96 93C97 97 95 99 92 99L64 99C62 99 61 98 60 96L53 82C51 78 49 78 47 82L40 96C39 98 38 99 36 99L8 "
          "99C5 99 3 97 4 93C9 82 16 68 22 54L9 54C2 54 0 47 3 40C7 30 20 24 34 21C35 20 35 19 35 17C35 8 41 "
          "1 50 1Z")
COLORI = ["#f53c32", "#3f99cc", "#f7d23e", "#f2efe6", "#2a2a2a", "#b44cc0", "#f39c12", "#15917f", "#7bd148"]

PANNO = ('<div style="position:absolute;inset:0;background:radial-gradient(ellipse at 50% 45%,#2f6b45 0%,'
         '#1f4d31 55%,#123120 100%)"></div><svg style="position:absolute;inset:0;opacity:.22;'
         'mix-blend-mode:overlay" width="1080" height="1920"><filter id="g"><feTurbulence type="fractalNoise" '
         'baseFrequency=".9" numOctaves="3" stitchTiles="stitch"/><feColorMatrix type="saturate" values="0"/>'
         '</filter><rect width="100%" height="100%" filter="url(#g)"/></svg>')
# ombra piatta a due toni: la metà in basso a destra più scura
DEF = ('<svg width="0" height="0" style="position:absolute"><defs><linearGradient id="lx" x1="0" y1="0" x2="1" '
       'y2="1"><stop offset=".58" stop-color="#000" stop-opacity="0"/><stop offset=".58" stop-color="#000" '
       'stop-opacity=".12"/></linearGradient></defs></svg>')


def meeple(n=38, seed=500, vietate=()):
    """n meeple sparsi fuori dai rettangoli (x0, y0, x1, y1) in `vietate`."""
    rnd, pts = random.Random(seed), []
    while len(pts) < n:
        s = rnd.randint(70, 108); x = rnd.randint(-25, 1080 - s + 25); y = rnd.randint(40, 1860 - s)
        fuori = all(not (x + s > a and x < c and y + s > b and y < d) for a, b, c, d in vietate)
        if fuori and all(math.hypot(x - px, y - py) > (s + ps) * 0.62 for px, py, ps in pts):
            pts.append((x, y, s))
    return "".join(
        f'<svg style="position:absolute;left:{x}px;top:{y}px;width:{s}px;height:{s}px;'
        f'transform:rotate({rnd.randint(-14, 14)}deg);filter:drop-shadow(0 7px 6px rgba(0,0,0,.4))" '
        f'viewBox="0 0 100 100"><path d="{MEEPLE}" fill="{COLORI[i % len(COLORI)]}"/>'
        f'<path d="{MEEPLE}" fill="url(#lx)"/></svg>' for i, (x, y, s) in enumerate(pts))


def festa(nome, foto, occhiello, titolo, larghezza=620):
    from PIL import Image
    fw, fh = Image.open(foto).size
    h = round(larghezza * fh / fw); left = (1080 - larghezza) // 2
    tit = ('<div class="testi" style="top:150px;text-align:center"><div class="filetto" style="margin:0 auto 34px">'
           f'</div><div class="occh" style="text-shadow:0 2px 12px rgba(0,0,0,.7)">{occhiello}</div>'
           f'<div class="dom" style="text-shadow:0 4px 24px rgba(0,0,0,.6)">{titolo}</div></div>')
    card = (f'<div style="position:absolute;left:{left}px;top:450px;width:{larghezza}px;height:{h}px;'
            'border-radius:24px;overflow:hidden;box-shadow:0 30px 70px rgba(0,0,0,.6);'
            f'border:2px solid rgba(255,255,255,.14)"><img src="{os.path.abspath(foto)}" '
            'style="width:100%;height:100%;object-fit:cover;display:block"></div>')
    # titolo, card e fascia dello sticker Domanda (circa 690x455 da y 1345) restano liberi
    vietate = [(140, 130, 940, 430), (left - 5, 435, left + larghezza + 5, 450 + h + 26), (180, 1330, 900, 1815)]
    return storia.rasterizza(f'<div class="st">{PANNO}{DEF}{meeple(vietate=vietate)}{tit}{card}'
                             '<div class="coda"></div></div>', nome)


if __name__ == "__main__":
    print(festa(*sys.argv[1:5]))
