# -*- coding: utf-8 -*-
"""局部放大复核：手 / C右侧孩子手臂 / B推开方糖动作
（视觉模型对整体图会自相矛盾，放大局部只问"看到什么"才可靠）"""
import base64, io, json, os, requests
from concurrent.futures import ThreadPoolExecutor
from PIL import Image

CFG = json.load(open('/data/www/files/LhyjdesignPro/config.json'))
KEY, BASE, MODEL = CFG['api_key'], CFG['base_url'], CFG['models']['text_vision']
ROOT = '/data/www/files/waterHealthArt/final2'
CROP_DIR = os.path.join(ROOT, 'crops')
os.makedirs(CROP_DIR, exist_ok=True)

CASES = [
 ('A_饮水思源_一滴水的旅行', (1500, 780, 2896, 2048), 2,
  "这是一张儿童画的局部放大。请只描述你看到的：画中人物拿杯子的手画成了什么样？"
  "有没有画出分开的手指（例如横在杯身上的几道手指短线）？还是像连指手套或一整块没有手指的圆润色块？"),
 ('C_接一杯_喝一口_关紧它', (950, 620, 2150, 1950), 2,
  "这是一张儿童画的局部放大。请只描述你看到的：画中人物拿杯子的手画成了什么样？"
  "有没有画出分开的手指（例如横在杯身上的几道手指短线）？"),
 ('C_接一杯_喝一口_关紧它', (1950, 500, 2896, 1900), 2,
  "这是一张儿童画的局部放大。请只描述你看到的：右侧这个孩子抬起的那条胳膊，和身体是连在一起的吗？"
  "有没有断开的错误？"),
 ('B_白开水最好喝', (120, 820, 1420, 1980), 2,
  "这是一张儿童画的局部放大。请只描述你看到的：桌面上那个孩子的动作是什么（手在做什么）？"
  "桌上的方糖处于什么状态？孩子另一只手里拿着什么？"),
]


def run(item):
    name, box, zoom, q = item
    p = os.path.join(ROOT, 'illustration', f'{name}.jpg')
    im = Image.open(p).convert('RGB').crop(box)
    im = im.resize((im.width * zoom, im.height * zoom), Image.LANCZOS)
    buf = io.BytesIO()
    im.save(buf, 'JPEG', quality=92)
    b64 = base64.b64encode(buf.getvalue()).decode()
    msgs = [{"role": "user", "content": [
        {"type": "image_url", "image_url": {"url": f"data:image/jpeg;base64,{b64}"}},
        {"type": "text", "text": q}]}]
    r = requests.post(f"{BASE}/chat/completions",
                      headers={"Authorization": f"Bearer {KEY}", "Content-Type": "application/json"},
                      json={"model": MODEL, "messages": msgs, "max_tokens": 350}, timeout=200).json()
    return f"===== {name}  裁{box} 放大{zoom}x\n{r['choices'][0]['message']['content'].strip()}\n"


with ThreadPoolExecutor(max_workers=4) as ex:
    for o in ex.map(run, CASES):
        print(o, flush=True)
