#!/usr/bin/env python3
"""Banner fixo 1×3 em QUADRADO 1:1 (1080×1080 por tile) — à prova de corte.
Post 1:1 nunca é recortado na grade nem no upload. Canvas único 3240×1080,
conteúdo dentro de zona segura. Auto-verifica simulando a grade."""
import subprocess
from pathlib import Path
from PIL import Image, ImageFilter, ImageDraw

P = Path(__file__).parent
CENAS = P.parent/"cenas"
CHROME = "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome"
W, H, N = 1080, 1080, 3
PW = W*N  # 3240

mono = Image.open(CENAS/"hero-monolitos.png").convert("RGB")   # 1536x1024
c = mono.crop((40, 40, 1180, 1024)).resize((1500, 1080), Image.LANCZOS)
c.filter(ImageFilter.UnsharpMask(radius=2, percent=50, threshold=2)).save(P/"q-esq.png")

nb = Image.open(CENAS/"bancada-notebook-mao.png").convert("RGB")
n2 = nb.crop((360, 40, 1536, 1024)).resize((1560, 1080), Image.LANCZOS)
n2.filter(ImageFilter.UnsharpMask(radius=2, percent=45, threshold=2)).save(P/"q-dir.png")

import random
random.seed(31)
linhas=[]
for k in range(22):
    x=random.randint(-80,PW+80); y0=random.randint(820,1060)
    seg=random.randint(200,560); vert=random.choice([-1,1])*random.randint(20,64)
    cor="#E2B15A" if random.random()<0.7 else "#7FA88A"
    op=round(random.uniform(0.10,0.30),2)
    linhas.append(f'<path d="M{x} {y0} h{seg//2} v{vert} h{seg//2}" stroke="{cor}" stroke-opacity="{op}" stroke-width="2.4" fill="none"/>')
    if random.random()<0.5: linhas.append(f'<circle cx="{x+seg//2}" cy="{y0+vert}" r="4.5" fill="{cor}" opacity="{op+0.25}"/>')
PISO="".join(linhas)
FIOS='''<path d="M-40 150 H1350 Q1400 150 1400 200 V360 Q1400 410 1450 410 H2600 Q2650 410 2650 360 V230 Q2650 180 2700 180 H3280" stroke="#E2B15A" stroke-opacity="0.30" stroke-width="3" fill="none"/>
<circle cx="1400" cy="280" r="6" fill="#E2B15A" opacity="0.8"/><circle cx="2650" cy="300" r="5" fill="#E2B15A" opacity="0.7"/>'''

HTML=f'''<!DOCTYPE html><html><head><meta charset="UTF-8"><style>
*{{margin:0;padding:0}}
body{{width:{PW}px;height:{H}px;position:relative;overflow:hidden;background:#05070B;
 font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;color:#F4F0E8}}
.ceu{{position:absolute;inset:0;background:
 radial-gradient(1500px 800px at 500px 260px,rgba(226,177,90,.12),transparent 70%),
 radial-gradient(1500px 800px at 2800px 340px,rgba(226,177,90,.13),transparent 70%),
 radial-gradient(1700px 700px at 1620px 160px,rgba(90,110,180,.09),transparent 70%),
 linear-gradient(180deg,#0A0E16,#0B0F14 55%,#05070B)}}
svg.t{{position:absolute;inset:0}}
.esq{{position:absolute;left:0;top:0;width:1500px;height:1080px;
 -webkit-mask-image:linear-gradient(90deg,black 52%,transparent 97%)}}
.dir{{position:absolute;right:0;top:0;width:1560px;height:1080px;
 -webkit-mask-image:linear-gradient(270deg,black 50%,transparent 97%)}}
.scrim{{position:absolute;left:0;top:330px;width:{PW}px;height:440px;
 background:linear-gradient(rgba(5,7,11,0),rgba(5,7,11,.66) 42%,rgba(5,7,11,.66) 58%,rgba(5,7,11,0))}}
.tx{{position:absolute;width:{PW}px;text-align:center}}
.l1{{top:398px;font-size:112px;font-weight:700;color:#F4F0E8;text-shadow:0 4px 40px rgba(0,0,0,.92)}}
.l2{{top:552px;font-size:112px;font-weight:700;
 background:linear-gradient(100deg,#F0C97E,#D9A64B);-webkit-background-clip:text;-webkit-text-fill-color:transparent;
 filter:drop-shadow(0 4px 34px rgba(0,0,0,.95))}}
.sub{{top:740px;font-size:34px;font-weight:600;color:#E2B15A;letter-spacing:1.5px;text-shadow:0 3px 22px rgba(0,0,0,.95)}}
.rod{{position:absolute;bottom:46px;width:{PW}px;text-align:center;font-size:36px;
 color:rgba(244,240,232,.7);letter-spacing:4px;text-shadow:0 2px 18px rgba(0,0,0,.9)}}
</style></head><body>
<div class="ceu"></div>
<svg class="t" width="{PW}" height="{H}" xmlns="http://www.w3.org/2000/svg">{FIOS}{PISO}</svg>
<img class="esq" src="q-esq.png"><img class="dir" src="q-dir.png">
<div class="scrim"></div>
<div class="tx l1">NÓS NÃO USAMOS IA.</div>
<div class="tx l2">NÓS ORQUESTRAMOS INTELIGÊNCIAS.</div>
<div class="tx sub">Nascida da prática executiva &nbsp;—&nbsp; sem hype, com senso.</div>
<div class="rod">@iacomsenso &nbsp;·&nbsp; iacomsenso.com.br</div>
</body></html>'''
(P/"banner1x1.html").write_text(HTML)
subprocess.run([CHROME,"--headless","--disable-gpu",f"--screenshot={P}/banner1x1.png",
                f"--window-size={PW},{H}","--hide-scrollbars","--force-device-scale-factor=1",
                f"file://{P}/banner1x1.html"],capture_output=True)
pan=Image.open(P/"banner1x1.png"); print("banner:",pan.size)
nomes=["A-esq","B-centro","C-dir"]
for i in range(N):
    pan.crop((i*W,0,(i+1)*W,H)).save(P/f"bq-{nomes[i]}.jpg", quality=92)

# ── AUTO-VERIFICAÇÃO: simular a grade do perfil (3 quadrados juntos, gap 4px) ──
gap=4; cell=430
sim=Image.new("RGB",(cell*3+gap*2+40, cell+40),(18,18,18))
for i in range(N):
    t=Image.open(P/f"bq-{nomes[i]}.jpg").resize((cell,cell),Image.LANCZOS)
    sim.paste(t,(20+i*(cell+gap),20))
sim.save(P/"banner1x1-GRADE-SIMULADA.png")
# verificação numérica: densidade de pixels claros (texto) longe das bordas de cada tile
import statistics
ok=True
for i in range(N):
    t=Image.open(P/f"bq-{nomes[i]}.jpg").convert("L")
    # zona segura = tudo (1:1 não corta); checar que texto não encosta na borda superior/inferior
    top=t.crop((0,0,W,60)); bot=t.crop((0,W-60,W,W))
    import numpy as np
    if (np.array(top)>180).mean()>0.02 or (np.array(bot)>180).mean()>0.02:
        ok=False; print(f"AVISO: tile {nomes[i]} tem conteudo claro colado na borda")
print("VERIFICACAO:", "OK - nada colado nas bordas" if ok else "revisar")
print("3 tiles 1:1 + grade simulada gerados")
