#!/usr/bin/env python3
"""MESMA ARTE (cena continua + frase fluindo, 2 linhas centradas), com o TAMANHO
de cada linha calculado pra os ESPACOS entre palavras caírem nas emendas (x=1080,
2160). Frase parece uma so; emendas caem no vao, nao na letra. Verificacao auto."""
import subprocess
from pathlib import Path
from PIL import Image, ImageFilter, ImageFont
import numpy as np

P = Path(__file__).parent
CENAS = P.parent/"cenas"
CHROME = "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome"
W,H,N = 1080,1350,3; PW=W*N
FONT = "/System/Library/Fonts/Helvetica.ttc"
SEAMS = [1080,2160]

def melhor_tamanho(palavras, faixa=range(78,150,2)):
    """acha o font-size onde 2 espacos da linha centrada caem mais perto das emendas."""
    best=None
    for fs in faixa:
        f=ImageFont.truetype(FONT,fs,index=1)
        sp=f.getlength(" ")
        larg=[f.getlength(w) for w in palavras]
        total=sum(larg)+sp*(len(palavras)-1)
        x=1620-total/2
        centros=[]  # centro de cada espaco
        for i in range(len(palavras)-1):
            x+=larg[i]; centros.append(x+sp/2); x+=sp
        # menor erro pra cada emenda
        err=0
        for seam in SEAMS:
            err+=min(abs(c-seam) for c in centros)
        if best is None or err<best[0]: best=(err,fs)
    return best[1]

L1=["NÓS","NÃO","USAMOS","IA."]
L2=["NÓS","ORQUESTRAMOS","INTELIGÊNCIAS."]
fs1=melhor_tamanho(L1); fs2=melhor_tamanho(L2)
print(f"tamanho linha1={fs1} linha2={fs2}")

# fundo = arte aprovada
mono=Image.open(CENAS/"hero-monolitos.png").convert("RGB")
mono.crop((40,0,1180,1024)).resize((1560,1350),Image.LANCZOS).filter(ImageFilter.UnsharpMask(2,50,2)).save(P/"fl-esq.png")
nb=Image.open(CENAS/"bancada-notebook-mao.png").convert("RGB")
nb.crop((360,0,1536,1024)).resize((1660,1350),Image.LANCZOS).filter(ImageFilter.UnsharpMask(2,45,2)).save(P/"fl-dir.png")

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 900px at 540px 400px,rgba(226,177,90,.13),transparent 66%),
 radial-gradient(1400px 1000px at 1620px 560px,rgba(240,201,126,.12),transparent 60%),
 radial-gradient(1500px 900px at 2700px 400px,rgba(90,120,200,.10),transparent 66%),
 linear-gradient(180deg,#0A0E16,#0B0F14 55%,#05070B)}}
.esq{{position:absolute;left:0;top:0;width:1560px;height:1350px;-webkit-mask-image:linear-gradient(90deg,black 44%,transparent 80%)}}
.dir{{position:absolute;right:0;top:0;width:1660px;height:1350px;-webkit-mask-image:linear-gradient(270deg,black 42%,transparent 80%)}}
.scrim{{position:absolute;left:0;top:420px;width:{PW}px;height:500px;
 background:linear-gradient(rgba(5,7,11,0),rgba(5,7,11,.62) 42%,rgba(5,7,11,.62) 58%,rgba(5,7,11,0))}}
.l{{position:absolute;width:{PW}px;text-align:center;font-weight:700;letter-spacing:-1px;
 text-shadow:0 4px 34px rgba(0,0,0,.95),0 2px 10px rgba(0,0,0,.92)}}
.ouro{{background:linear-gradient(100deg,#F0C97E,#D9A64B);-webkit-background-clip:text;
 -webkit-text-fill-color:transparent;filter:drop-shadow(0 4px 30px rgba(0,0,0,.95))}}
.sub{{position:absolute;width:{PW}px;text-align:center;top:900px;font-size:34px;font-weight:600;
 letter-spacing:2px;color:#E2B15A;text-shadow:0 3px 20px rgba(0,0,0,.95)}}
.selo{{position:absolute;transform:translateX(-50%);text-align:center;bottom:70px;font-size:30px;
 letter-spacing:3px;color:rgba(244,240,232,.6)}}
</style></head><body>
<div class="ceu"></div><img class="esq" src="fl-esq.png"><img class="dir" src="fl-dir.png">
<div class="scrim"></div>
<div class="l" style="top:520px;font-size:{fs1}px">NÓS NÃO USAMOS IA.</div>
<div class="l ouro" style="top:{520+fs1+30}px;font-size:{fs2}px">NÓS ORQUESTRAMOS INTELIGÊNCIAS.</div>
<div class="sub">sem hype · com senso</div>
<div class="selo" style="left:540px">@iacomsenso</div>
<div class="selo" style="left:1620px">IA com Senso</div>
<div class="selo" style="left:2700px">iacomsenso.com.br</div>
</body></html>'''
(P/"fluido.html").write_text(HTML)
subprocess.run([CHROME,"--headless","--disable-gpu",f"--screenshot={P}/fluido.png",
 f"--window-size={PW},{H}","--hide-scrollbars","--force-device-scale-factor=1",f"file://{P}/fluido.html"],capture_output=True)
pan=Image.open(P/"fluido.png"); arr=np.array(pan.convert("L"))
def claro(xc,b=60,thr=150): return float((arr[300:1000,xc-b:xc+b]>thr).mean())
s1,s2=claro(1080),claro(2160)
print(f"emenda 1080 claro={s1:.3f} | 2160 claro={s2:.3f} -> {'SEGURO' if s1<0.012 and s2<0.012 else 'REVISAR'}")
nomes=["A-esq","B-centro","C-dir"]
for i in range(N): pan.crop((i*W,0,(i+1)*W,H)).convert("RGB").save(P/f"fl-{nomes[i]}.jpg",quality=92)
gap=8; g=Image.new("RGB",(3*430+2*gap+40,538+40),(0,0,0))
for i in range(N): g.paste(Image.open(P/f"fl-{nomes[i]}.jpg").resize((430,538),Image.LANCZOS),(20+i*(430+gap),20))
g.save(P/"fl-GRADE.png"); print("fluido gerado")
