#!/usr/bin/env python3.12
"""0929 配图修复：2 张车型升级原图 + 3 张社会热点豆包重生成（严格无人物）"""
import sys, os, time, urllib.request
sys.path.insert(0, '/data/news/scripts')
from PIL import Image
import image_relevance_guard as G

IMG = '/data/news/images/0929/'
UA = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36'
NOP = '无人空镜，画面中不得出现任何人物、人脸、人影与人体局部'

def dl(url, dst, referer):
    req = urllib.request.Request(url, headers={'User-Agent': UA, 'Referer': referer})
    open(dst, 'wb').write(urllib.request.urlopen(req, timeout=90).read())
    im = Image.open(dst); im.load()           # 完整性校验（防截断）
    return im

def to_jpeg(im, dst, width=750):
    if im.mode in ('RGBA', 'P', 'LA'):
        im = im.convert('RGBA'); bg = Image.new('RGB', im.size, (255, 255, 255))
        bg.paste(im, mask=im.split()[-1]); im = bg
    else:
        im = im.convert('RGB')
    if im.width > width:
        im = im.resize((width, int(round(im.height * width / im.width))), Image.LANCZOS)
    im.save(dst, 'JPEG', quality=90)
    o = Image.open(dst)
    print(f'   ✅ {os.path.basename(dst)} {o.format} {o.size} {os.path.getsize(dst)//1024}KB', flush=True)

# ---------- A. 车型：爬原图大图变体 ----------
print('=== A. 车型原图升级 ===', flush=True)
AUTO = [
    ('vehicle_hotspots_1.jpg',
     'https://img3.autoimg.cn/chejiahaodfs/g34/M08/E6/5B/1600x0_1_autohomecar__ChtpWGq5_2-AddaZAByApO3D-M0340.png',
     'https://www.autohome.com.cn/'),
    ('vehicle_hotspots_3.jpg',
     'https://image.bitautoimg.com/appimage-1024-w0/news/2026/09/28/104b6681-32e5-46c5-982c-9a72daa4d2ac.jpg',
     'https://news.yiche.com/'),
]
for fn, url, ref in AUTO:
    dst = IMG + fn
    for attempt in range(3):
        try:
            im = dl(url, dst, ref)
            if im.width < 600:
                print(f'   ⚠️ {fn} 变体宽仅 {im.width}，重试', flush=True); continue
            to_jpeg(im, dst); break
        except Exception as e:
            print(f'   ❌ {fn} 第{attempt+1}次: {str(e)[:80]}', flush=True); time.sleep(2)

# ---------- B. 社会热点：豆包重生成（无人物） ----------
print('\n=== B. 社会热点豆包重生成 ===', flush=True)
GEN = [
    ('social_hotspots_0.jpg',
     '七部门：到 2030 年，全固态电池初步实现规模化应用',
     '七部门发布新型电池产业规划，明确2030年全固态电池初步规模化。',
     [f'配图：全固态电池与新型电池产业发展规划发布，实验室中固态电池电芯与电池材料特写，'
      f'新闻配图风格，写实，横向构图，16:9，高清，{NOP}',
      f'配图：全固态电池技术示意，纯电汽车电池包与固态电芯结构展示，'
      f'新闻配图风格，写实，横向构图，16:9，高清，{NOP}',
      f'配图：新型电池产业与新能源电力场景，电池储能柜与充电设施，'
      f'新闻配图风格，写实，横向构图，16:9，高清，{NOP}']),
    ('social_hotspots_1.jpg',
     'Sharpa三大新品IROS全球首秀 刷新灵巧操作上限',
     'Sharpa在IROS首发三款机器人新品，覆盖本体、灵巧手与数据手套。',
     [f'配图：机器人灵巧操作新品发布，人形机器人本体与机械灵巧手在展台展示，'
      f'新闻配图风格，写实，横向构图，16:9，高清，无真人，不出现人脸、人影、人体与真人手部',
      f'配图：多指机械灵巧手特写，金属关节与触觉传感器细节，深色科技背景，'
      f'新闻配图风格，写实，横向构图，16:9，高清，无真人，不出现人脸、人影、人体与真人手部',
      f'配图：机器人技术发布会现场，人形机器人与数据采集手套装置陈列，'
      f'新闻配图风格，写实，横向构图，16:9，高清，无真人，不出现人脸、人影、人体与真人手部']),
    ('social_hotspots_2.jpg',
     '微软 CEO 纳德拉如何使用智能体：动手操控、追问、继续推理，而非盲目信任',
     '纳德拉披露用Excel智能体做因果推理，强调要追问而非盲目信任。',
     [f'配图：企业级人工智能智能体应用，电子表格与数据分析界面在屏幕上呈现推理流程，'
      f'新闻配图风格，写实，横向构图，16:9，高清，{NOP}',
      f'配图：人工智能智能体处理电子表格与供应链数据模型的办公桌面场景，冷色调，'
      f'新闻配图风格，写实，横向构图，16:9，高清，{NOP}',
      f'配图：数据分析与因果推理的可视化图表界面，蓝色科技感，'
      f'新闻配图风格，写实，横向构图，16:9，高清，{NOP}']),
]
for fn, title, summ, prompts in GEN:
    dst = IMG + fn
    print(f'-- {fn}', flush=True)
    done = False
    for ci, pr in enumerate(prompts, 1):
        if done: break
        try:
            raw = G.gen_image(pr)
            tmp = f'/tmp/regen0929_{fn}_{ci}.jpg'
            open(tmp, 'wb').write(raw)
            G.strip_watermark(Image.open(tmp).convert('RGB')).save(dst, 'JPEG', quality=92)
            o = Image.open(dst)
            ok, why, desc = G.parse_relevance(G.relevance_ask(dst, title, summ))
            print(f'   候选{ci} {o.size} {os.path.getsize(dst)//1024}KB 判定={ok} {why} | {desc[:100]}', flush=True)
            if ok: done = True
        except Exception as e:
            print(f'   候选{ci} 异常: {str(e)[:90]}', flush=True)
    if not done:
        print(f'   ⚠️ {fn} 需人工复核（候选已留在 /tmp/regen0929_{fn}_*.jpg）', flush=True)

print('\nDONE', flush=True)
for fn in ['vehicle_hotspots_1.jpg', 'vehicle_hotspots_3.jpg',
           'social_hotspots_0.jpg', 'social_hotspots_1.jpg', 'social_hotspots_2.jpg']:
    p = IMG + fn
    if os.path.exists(p):
        o = Image.open(p)
        print(f'  {fn:28s} {o.format} {o.size} {os.path.getsize(p)//1024}KB')
