#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""MiniMax 插画后处理：选片 → 落定稿 → 扫水印（MiniMax 无水印，作兜底）→ 降采样 → webp。
输出 _img_price_deck/mm_<name>_clean.webp（内嵌用）+ _clean.png（存档）
"""
import io
import os
import shutil
import sys

from PIL import Image, ImageDraw, ImageFilter

OUT = '/Users/liuxinyuan/Desktop/Hermes输出-工作类/培训与上手/培训/_img_price_deck'
LONG = 1280

# 选片：name -> 源文件
PICK = {
    'scene_tug':   'cand_scene_tug_1.png',
    'scene_weigh': 'mm_scene_weigh.png',
    'scene_deal':  'mm_scene_deal.png',
    'scene_price': 'cand_scene_price_1.png',
    'jobs_cart':   'cand_jobs_cart_2.png',
}


def lum_sat(p):
    r, g, b = p[0], p[1], p[2]
    return (0.299 * r + 0.587 * g + 0.114 * b), (max(r, g, b) - min(r, g, b))


def find_watermark(im):
    """只在小窗口内找灰胶囊（右下角）。MiniMax 无水印时应返回 None。"""
    W, H = im.size
    px = im.load()
    xs, ys = [], []
    for y in range(int(H * 0.855), H):
        for x in range(int(W * 0.865), W):
            L, S = lum_sat(px[x, y])
            if S < 30 and 110 < L < 218:
                xs.append(x)
                ys.append(y)
    if not xs:
        return None
    box = (min(xs), min(ys), max(xs), max(ys))
    if (box[2] - box[0]) > 0.17 * W or (box[3] - box[1]) > 0.15 * H:
        return None                       # 尺寸异常 → 判为误检，不动图
    return box


def run(name, src):
    p = os.path.join(OUT, src)
    im = Image.open(p).convert('RGB')
    W, H = im.size
    box = find_watermark(im)
    if box:
        bx0, by0, bx1, by1 = box
        pad = 10
        bx0, by0 = max(0, bx0 - pad), max(0, by0 - pad)
        bx1, by1 = min(W, bx1 + pad), min(H, by1 + pad)
        ref = im.crop((max(0, bx0 - 260), by0, max(1, bx0 - 40), by1))
        pix = list(ref.getdata())
        med = tuple(sorted(c[i] for c in pix)[len(pix) // 2] for i in range(3))
        patch = Image.new('RGB', (bx1 - bx0, by1 - by0), med)
        d = ImageDraw.Draw(patch)
        st = max(3, (bx1 - bx0) // 14)
        for i in range(0, bx1 - bx0, st):
            for j in range(0, by1 - by0, st):
                v = ((i * 7 + j * 13) % 5) - 2
                d.point((i, j), fill=(med[0] + v, med[1] + v, med[2] + v))
        im.paste(patch.filter(ImageFilter.GaussianBlur(1.1)), (bx0, by0))
        print('      ⚠ 检测到水印并已回填 %s' % (box,))
    im.save(os.path.join(OUT, 'mm_%s_final.png' % name))
    # MiniMax 恒定输出 1024x1024（忽略 image_size）→ 居中裁到 3:2 以匹配 deck 插槽
    w, h = im.size
    want = int(round(w * 2.0 / 3.0))
    if h > want:
        top = (h - want) // 2
        im = im.crop((0, top, w, top + want))
    k = LONG / float(max(im.size))
    if k < 1:
        im = im.resize((int(round(im.size[0] * k)), int(round(im.size[1] * k))),
                       Image.LANCZOS)
    cpng = os.path.join(OUT, 'mm_%s_clean.png' % name)
    im.save(cpng)
    webp = os.path.join(OUT, 'mm_%s_clean.webp' % name)
    im.save(webp, 'WEBP', quality=86, method=6)
    print('  %-12s src=%-22s %dx%d (3:2 居中裁)  webp %dKB  %s' % (
        name, src, im.size[0], im.size[1], os.path.getsize(webp) // 1024,
        '无水印' if not box else '已处理'))


if __name__ == '__main__':
    print('MiniMax 后处理 →', OUT)
    for n, s in PICK.items():
        run(n, s)
