from PIL import Image, ImageDraw, ImageFont, ImageEnhance
import os
EB='Manrope-ExtraBold.ttf'; MD='Manrope-Medium.ttf'
GOLD=(214,178,110); WHITE=(255,255,255)

def fit(im,W,H):
    r=max(W/im.width,H/im.height)
    im=im.resize((round(im.width*r),round(im.height*r)),Image.LANCZOS)
    l,t=(im.width-W)//2,(im.height-H)//2
    return im.crop((l,t,l+W,t+H))

def wrap(d,txt,f,maxw):
    out=[];line=''
    for w in txt.split():
        t=(line+' '+w).strip()
        if d.textlength(t,font=f)<=maxw: line=t
        else:
            if line: out.append(line)
            line=w
    if line: out.append(line)
    return out

def make(bg,title,sub,badge,W,H,out,maxlines=3):
    im=fit(Image.open('src/'+bg).convert('RGB'),W,H)
    im=ImageEnhance.Color(im).enhance(1.04)
    # сильная тёмная подложка слева (65% ширины) + лёгкое общее затемнение
    grad=Image.new('L',(W,H),0); dg=ImageDraw.Draw(grad)
    for x in range(W):
        k=x/W
        a=int(225*max(0.0,1-(k/0.58)**1.35)) + 26
        dg.line([(x,0),(x,H)],fill=min(255,a))
    im=Image.composite(Image.new('RGB',(W,H),(9,11,15)),im,grad)
    d=ImageDraw.Draw(im)
    pad=int(W*0.055); maxw=int(W*(0.60 if W<=H else 0.56))
    ts=int(H*0.105) if W<=H else int(min(W*0.070,H*0.155))
    ft=ImageFont.truetype(EB,ts); lines=wrap(d,title,ft,maxw)
    while len(lines)>maxlines and ts>int(H*0.05):
        ts=int(ts*0.92); ft=ImageFont.truetype(EB,ts); lines=wrap(d,title,ft,maxw)
    ss=max(int(ts*0.40),int(H*0.030)); fs=ImageFont.truetype(MD,ss); fb=ImageFont.truetype(EB,int(ss*0.88))
    subl=wrap(d,sub,fs,maxw) if sub else []
    lh=int(ts*1.12); slh=int(ss*1.30)
    bh=int(ss*2.0) if badge else 0
    block=len(lines)*lh+(int(ss*0.7)+len(subl)*slh if subl else 0)+(bh+int(ss*0.8) if badge else 0)
    foot=int(W*(0.30 if W<=H else 0.24)*0.361)+int(W*0.055)
    y=max(int(W*0.055),min((H-block)//2,H-foot-block-int(H*0.03)))
    if badge:
        bw=d.textlength(badge,font=fb)+int(pad*1.0)
        d.rounded_rectangle([pad,y,pad+bw,y+bh],radius=bh//2,fill=GOLD)
        d.text((pad+int(pad*0.5),y+bh//2),badge,font=fb,fill=(12,14,18),anchor='lm')
        y+=bh+int(ss*0.8)
    for l in lines:
        d.text((pad,y),l,font=ft,fill=WHITE); y+=lh
    if subl:
        y+=int(ss*0.7)
        for l in subl:
            d.text((pad,y),l,font=fs,fill=(226,226,230)); y+=slh
    lg=Image.open('logo_white.png').convert('RGBA')
    lw=int(W*(0.30 if W<=H else 0.24)); lh2=round(lg.height*lw/lg.width)
    lg=lg.resize((lw,lh2),Image.LANCZOS)
    im.paste(lg,(pad,H-pad-lh2),lg)
    im.save(out,quality=92); return out

ADS=[
 ('e1d2dd071f4895e4a8cdd38381acc144.jpg','Эластичная краска для фасада: от −50 до +50 °C','Тянется в 3 раза сильнее обычных «резиновых». Трещины не проступают','фасад и цоколь','g1_elasten'),
 ('b8a596adc8a7e9f007604a7ee007f3e2.jpg','Материал от 450 ₽/м², покраска под ключ','Гарантия 10 лет, выезд замерщика бесплатно','гарантия 10 лет','g2_podkluch'),
]
os.makedirs('out',exist_ok=True)
for bg,t,s,b,name in ADS:
    make(bg,t,s,b,1080,1080,f'out/{name}_1x1.jpg')
    make(bg,t,s,b,1200,675,f'out/{name}_16x9.jpg')
print('done')
