# -*- coding: utf-8 -*-
"""批量 OCR 合同照片 -> 逐页 Markdown"""
import base64, json, os, sys, glob, io, time
import urllib.request, urllib.error
from concurrent.futures import ThreadPoolExecutor
from PIL import Image

API="https://api.deepseek.com/v1/chat/completions"
MODEL="deepseek-v4-flash-vision-exp"
KEY="sk-2af0093dfbac45359276d8aa85d83618"
SRC="/home/zyw/Downloads/dl-hub/26-合同审查/originals"
OUT="/home/zyw/Downloads/dl-hub/26-合同审查/pages"

PROMPT = """这是一份中文合同/协议的扫描照片（手机拍摄）。请逐字准确转录图片中的全部文字，要求：
1. 严格按图片从上到下、从左到右的阅读顺序输出，不要遗漏任何文字（包括标题、编号、正文、表格、手写内容、印章文字、页脚页码）。
2. 保持原文用词、标点、数字、金额、日期完全一致，不要改写、不要总结、不要纠错、不要补充。
3. 用 Markdown 格式输出：标题用 # / ##，条款编号保留原样（如"第一条"、"1."、"（一）"）。
4. 如果某处文字模糊无法辨认，用 〔?〕 标注；如果是空白处（如未填写的手写空格、签名处），用【空白】标注。
5. 如果有手写填写的内容，用 (手写: xxx) 标注。如果有印章/签名，用 <印章: xxx> 标注。
6. 只输出转录内容本身，不要加任何解释性开场白或结束语。

请开始转录："""

def ocr(path):
    data = open(path,"rb").read()
    b64 = base64.b64encode(data).decode()
    payload={"model":MODEL,"temperature":0,"max_tokens":8000,
      "messages":[{"role":"user","content":[
        {"type":"image_url","image_url":{"url":f"data:image/jpeg;base64,{b64}"}},
        {"type":"text","text":PROMPT}]}]}
    for attempt in (1,2,3):
        try:
            req=urllib.request.Request(API,data=json.dumps(payload).encode(),
              headers={"Authorization":f"Bearer {KEY}","Content-Type":"application/json"})
            with urllib.request.urlopen(req,timeout=600) as r:
                d=json.loads(r.read())
            return d.get("choices",[{}])[0].get("message",{}).get("content","(空)")
        except Exception as e:
            if attempt==3: return f"__ERROR__ {e}"
            time.sleep(3*attempt)

def work(f):
    name=os.path.splitext(os.path.basename(f))[0]
    dst=os.path.join(OUT,name+".md")
    if os.path.exists(dst) and os.path.getsize(dst)>50:
        return f"skip {name}"
    txt=ocr(f)
    open(dst,"w",encoding="utf-8").write(txt)
    return f"done {name} ({len(txt)} chars)"

files=sorted(glob.glob(SRC+"/*.jpg"))
with ThreadPoolExecutor(max_workers=5) as ex:
    for r in ex.map(work, files):
        print(r, flush=True)
print("ALL DONE")
