# -*- coding: utf-8 -*-
"""A4 彩色板报：叠彩色板报字标题（配色图）/ 空心字标题（线条图）"""
import os, glob
from PIL import Image, ImageDraw, ImageFont

RICH = '/data/www/files/heibanbaoArt/rich'
LINE = '/data/www/files/heibanbaoArt/line_rich'
OUT_C = '/data/www/files/heibanbaoArt/color_a4'
OUT_L = '/data/www/files/heibanbaoArt/line_a4'
os.makedirs(OUT_C, exist_ok=True)
os.makedirs(OUT_L, exist_ok=True)

FONT = '/usr/share/fonts/opentype/noto/NotoSansCJK-Bold.ttc'
IDX = 2

TITLES = {
 '1_安全伴我行_盾牌': ('安全伴我行', '校园安全 · 交通安全 · 消防安全 · 防溺水 · 防欺凌 · 食品安全'),
 '2_文明出行_交通标志': ('文明出行 平安相伴', '交通安全 · 消防安全 · 安全小贴士'),
 '3_珍爱生命_防溺水': ('珍爱生命 谨防溺水', '防溺水 · 食品安全 · 自我保护常识'),
 '4_反诈小卫士_手机': ('反诈小卫士', '防范电信网络诈骗 · 不轻信 · 不透露 · 不转账'),
 '5_远离毒品_健康成长': ('远离毒品 健康成长', '禁毒教育 · 珍爱生命 · 拒绝第一口'),
}

RED, YEL, WHITE, NAVY = (214, 40, 40), (255, 210, 74), (255, 255, 255), (27, 79, 156)


def fit_fs(text, target_w=2300, cap=290):
    n = len(text.replace(' ', '')) + text.count(' ') * 0.55
    return int(min(cap, target_w / max(n, 1)))


def colour_title(base, text, fs, y_main, y_sub):
    img = base.convert('RGB')
    d = ImageDraw.Draw(img)
    cx = img.width // 2
    f = ImageFont.truetype(FONT, fs, index=IDX)
    # 三层：白外晕 -> 黄描边 -> 红字
    d.text((cx, y_main), text[0], font=f, fill=WHITE,
           stroke_width=max(18, fs // 8), stroke_fill=WHITE, anchor='ms')
    d.text((cx, y_main), text[0], font=f, fill=YEL,
           stroke_width=max(9, fs // 17), stroke_fill=YEL, anchor='ms')
    d.text((cx, y_main), text[0], font=f, fill=RED, anchor='ms')
    f2 = ImageFont.truetype(FONT, 54, index=IDX)
    d.text((cx, y_sub), text[1], font=f2, fill=NAVY,
           stroke_width=7, stroke_fill=WHITE, anchor='ms')
    return img


def hollow_title(base, text, fs, y_main, y_sub):
    img = base.convert('RGB')
    d = ImageDraw.Draw(img)
    cx = img.width // 2
    f = ImageFont.truetype(FONT, fs, index=IDX)
    # 白底衬：把标题背后的线条断开，形成"标题在上"的层次
    d.text((cx, y_main), text[0], font=f, fill=(255, 255, 255),
           stroke_width=max(16, fs // 12), stroke_fill=(255, 255, 255), anchor='ms')
    d.text((cx, y_main), text[0], font=f, fill=(255, 255, 255),
           stroke_width=max(6, fs // 26), stroke_fill=(25, 25, 25), anchor='ms')
    f2 = ImageFont.truetype(FONT, 54, index=IDX)
    d.text((cx, y_sub), text[1], font=f2, fill=(255, 255, 255),
           stroke_width=10, stroke_fill=(255, 255, 255), anchor='ms')
    d.text((cx, y_sub), text[1], font=f2, fill=(25, 25, 25), anchor='ms')
    return img


if __name__ == '__main__':
    for name, text in TITLES.items():
        fs = fit_fs(text[0])
        y_main = int(fs * 1.05)
        y_sub = y_main + int(fs * 0.40) + 20
        c = colour_title(Image.open(os.path.join(RICH, name + '.jpg')), text, fs, y_main, y_sub)
        c.save(os.path.join(OUT_C, name + '.jpg'), quality=95, subsampling=0, dpi=(300, 300))
        p2 = os.path.join(LINE, name + '.jpg')
        if os.path.exists(p2):
            l = hollow_title(Image.open(p2), text, fs, y_main, y_sub)
            l.save(os.path.join(OUT_L, name + '.jpg'), quality=95, subsampling=0, dpi=(300, 300))
        print('OK', name, 'fs', fs, 'y', y_main, y_sub)
