# -*- coding: utf-8 -*-
"""A4 彩色板报 / 线条稿 批量质检"""
import base64, json, os, glob, requests
from concurrent.futures import ThreadPoolExecutor

CFG = json.load(open('/data/www/files/LhyjdesignPro/config.json'))
API_KEY, BASE = CFG['api_key'], CFG['base_url']
VM = CFG['models']['text_vision']

QC = ("这是一张印在A4纸上的小学彩色板报版式设计稿（白纸底+彩色手绘）。请只描述事实，逐条回答：\n"
      "1) 顶部红字黄边的大标题和下面的深蓝小字，有没有被画面里的图形、线条或插图压住、穿过、遮挡？哪几个字？\n"
      "2) 除顶部标题外，画面里还有没有其他文字、字母、数字、伪文字？有就写出来在哪；没有写「无」。\n"
      "3) 背景是白色纸张还是深色黑板？线条是否统一为一种深色描边（有没有红蓝错位双线、彩色描边）？\n"
      "4) 有哪几个留白书写框？形状和位置？内部是不是纯白空的？\n"
      "5) 有没有元素悬空、线条断裂、人物肢体畸形、比例失调等硬伤？\n"
      "6) 色彩是否丰富明亮（红黄蓝绿橙粉紫等），还是偏单调？")

QL = ("这是一张小学彩色板报的黑白线条稿。请只描述事实，逐条回答：\n"
      "1) 是否纯白底 + 纯黑线条？有没有灰色调、阴影、渐变、彩色残留？\n"
      "2) 除顶部标题外，还有没有其他文字、字母、数字、伪文字？有就写出来在哪；没有写「无」。\n"
      "3) 顶部标题是不是空心字（黑轮廓+白色内部）？有没有被画面元素压住？\n"
      "4) 有哪些留白框？形状位置？内部是否纯白？\n"
      "5) 有没有悬空、断线、人物肢体畸形等硬伤？")


def qa(args):
    p, q = args
    b64 = base64.b64encode(open(p, 'rb').read()).decode()
    for a in range(3):
        try:
            r = requests.post(f"{BASE}/chat/completions",
                headers={"Authorization": f"Bearer {API_KEY}", "Content-Type": "application/json"},
                json={"model": VM, "messages": [{"role": "user", "content": [
                    {"type": "image_url", "image_url": {"url": f"data:image/jpeg;base64,{b64}"}},
                    {"type": "text", "text": q}]}], "temperature": 0.1}, timeout=300)
            return p, r.json()['choices'][0]['message']['content']
        except Exception as e:
            print('EXC', p, a, e, flush=True)
    return p, 'FAIL'


if __name__ == '__main__':
    jobs = []
    for d, q in (('/data/www/files/heibanbao3in1/color_a4', QC), ('/data/www/files/heibanbao3in1/line_a4', QL)):
        for f in sorted(glob.glob(os.path.join(d, '*.jpg'))):
            jobs.append((f, q))
    with ThreadPoolExecutor(max_workers=5) as ex:
        for p, t in ex.map(qa, jobs):
            print('\n' + '=' * 66 + f'\n【{os.path.basename(os.path.dirname(p))}/{os.path.basename(p)}】\n{t}', flush=True)
