import re
import subprocess
import json
import os
import time
from datetime import datetime
import cv2
from pyzbar.pyzbar import decode
from PIL import Image, ImageTk
import tkinter as tk
import sys

# === 1. 初始化扫码日志 ===
start_time = datetime.now().strftime("%Y%m%d_%H%M")
result_log_file = f"result_{start_time}.log"
recognized_count = 0
seen_qrcodes = set()
seen_timestamps = {}

# 写入日志文件头
with open(result_log_file, "w", encoding="utf-8") as f:
    f.write("总识别二维码数量: 0\n")

# === 2. 摄像头 & GUI 设置 ===
cap = cv2.VideoCapture(0, cv2.CAP_V4L2)
cap.set(cv2.CAP_PROP_FOURCC, cv2.VideoWriter_fourcc(*'MJPG'))
cap.set(cv2.CAP_PROP_FRAME_WIDTH, 1280)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 720)
if not cap.isOpened():
    print("❌ 摄像头打开失败")
    sys.exit(1)

root = tk.Tk()
root.title("📷 QR Code Scanner")
label = tk.Label(root)
label.pack(pady=10)
btn = tk.Button(root, text="退出程序（含查询）", font=("Arial",12), bg="red", fg="white")
btn.pack(pady=5)

# === 3. 扫码并写日志 ===
def update_frame():
    global recognized_count
    ret, frame = cap.read()
    if not ret:
        root.after(30, update_frame)
        return

    for obj in decode(frame):
        if obj.type != "QRCODE":
            continue
        data = obj.data.decode('utf-8')
        now = time.time()
        if data not in seen_qrcodes:
            recognized_count += 1
            seen_qrcodes.add(data)
            seen_timestamps[data] = now
            # 读取旧行，更新总数与追加新行
            with open(result_log_file, "r", encoding="utf-8") as f:
                old = f.readlines()[1:]
            with open(result_log_file, "w", encoding="utf-8") as f:
                f.write(f"总识别二维码数量: {recognized_count}\n")
                f.writelines(old)
                f.write(data + "\n")
            print(f"✅ 识别成功（共 {recognized_count} 个）：{data}")
        else:
            if now - seen_timestamps[data] > 3:
                print(f"🔁 已识别过，忽略：{data}")
                seen_timestamps[data] = now
        # 在画面上标记
        x,y,w,h = obj.rect.left, obj.rect.top, obj.rect.width, obj.rect.height
        cv2.rectangle(frame, (x,y), (x+w,y+h), (0,255,0), 2)
        cv2.putText(frame, data, (x, y-10),
                    cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0,255,0), 2)
    # 显示画面
    frame_rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
    img = ImageTk.PhotoImage(Image.fromarray(frame_rgb))
    label.config(image=img)
    label.image = img
    root.after(30, update_frame)

# === 4. 退出时一键查询 ===
def run_query_on_exit():
    print("\n📦 开始物料信息查询…")
    # 1) 解析日志：提取 pc、qty、on
    records = []
    with open(result_log_file, "r", encoding="utf-8") as f:
        for line in f:
            m_pc = re.search(r'pc:([^,}]+)', line)
            if m_pc:
                pc = m_pc.group(1).strip()
                m_qty = re.search(r'qty:([^,}]+)', line)
                qty = m_qty.group(1).strip() if m_qty else ""
                m_on = re.search(r'on:([^,}]+)', line)
                on = m_on.group(1).strip() if m_on else ""
                records.append({"pc":pc,"qty":qty,"on":on})
    if not records:
        print("⚠️ 未找到任何 pc 编号，跳过查询")
        return

    # 2) 创建输出目录
    output_dir = "eda_json"
    os.makedirs(output_dir, exist_ok=True)

    # 3) 准备 Markdown 表格头
    md = []
    md.append("| LCSC 编号 | 品名 | 品牌名称 | 中文品类名 | 封装标准 | 拆分比 | 数量 | 起始价格 | 描述 | 订单号 |")
    md.append("|-----------|------|-----------|--------------|------------|--------|--------|-----------|--------|--------|")

    # 4) 请求模板（替换为你的cookie）
    CURL_BASE = [
        "curl", "https://pro.lceda.cn/api/v2/eda/product/search",
        "-H","Accept: application/json, text/javascript, */*; q=0.01",
        "-H","Accept-Language: zh-CN,zh;q=0.9,en;q=0.8",
        "-H","Content-Type: application/json; charset=UTF-8",
        "-b","sensorsdata2015jssdkcross=dfm-enc-%7B%22Va28a6y8_aV%22%3A%22BtHIGIAs%22%2C%22gae28_aV%22%3A%22EGArIyRRrnsEusy-AGRRrIHtStRuAyt-SynHRuHt-IntnSAA-EGArIyRRrnIuRu%22%2C%22OemO2%22%3A%7B%22%24ki8r28_8eiggay_2mbeyr_8cOr%22%3A%22%E5%BC%95%E8%8D%90%E6%B5%81%E9%87%8F%22%2C%22%24ki8r28_2rieyz_lrcMmeV%22%3A%22%E6%9C%AA%E5%8F%96%E5%88%B0%E5%80%BC%22%2C%22%24ki8r28_ergreere%22%3A%22z88O2%3A%2F%2Fm2zMzbu.ymo%2F%22%2C%22%24ki8r28_ki6Va6f_Oifr%22%3A%22z88O2%3A%2F%2FOem.kyrVi.y6%2FrVa8me%23aV%3DiVGtHEuEVyEuSnuHtuVsHussAtSHyGRi%2C8iu%3D*nIRSnIusHyHtSyryGIEuIHtiGuiiEnGG%22%7D%2C%22aVr68a8ar2%22%3A%22rc3liZ7ku67OV5kgPsGCiskkDskl3qmawFlMWFQqQhVkQq3JPqxqBF0HQhVkwhKSQXfIPqLqpvAAPhPEQs3EpvAhQqfsQX0MBF1Hw9KhPhyIWFPhPqVa3aMax9klWZHAiD7HDsJCWskbDskl3qmaFXfEwhlhwX3agN%3D%3D%22%2C%22za28mec_kmfa6_aV%22%3A%7B%226ior%22%3A%22%24aVr68a8c_kmfa6_aV%22%2C%22Cikbr%22%3A%22BtHIGIAs%22%7D%2C%22%24VrCayr_aV%22%3A%22EGArIyRRrnsEusy-AGRRrIHtStRuAyt-SynHRuHt-IntnSAA-EGArIyRRrnIuRu%22%7D; HWWAFSESID=3cb22732dade881cff; HWWAFSESTIME=1745300920464; _ga_SBSVCM6H64=GS1.1.1745300921.1.0.1745300921.0.0.0; _ga=GA1.1.1288318448.1745300922; version=eyJpdiI6InUzVWFyck91NnJYU0NFYm5PblwvdWNnPT0iLCJ2YWx1ZSI6InROcVgxeEF5TURWWEc0MG5qSHQ4M1c1VTBmUVhzR21KVU1QMUhwT0Jaa289IiwibWFjIjoiMzQ3MmUwOWUwNWZhMTUyYzllNTE5ZDFjNWNjZTNiZmI3YmJjOGE4NTk1NWE2ZDJkYTU0OTg2MDQxYjFhMzlkMSJ9; lceda_pro_session=eyJpdiI6InJESFV3ZGo0R29aXC8yYjhKQzFJS2Z3PT0iLCJ2YWx1ZSI6IlFiZzJDc3VxRE5XMlFhSFVrNTR6ekNoZ0s3UGlCTkVuaWMwcWVcL0NGV044YTg1bHdJK0xMekd4YTFJQkRxcEVmQXgySVBhQStKTFZBWHQyVTRwYTlaQT09IiwibWFjIjoiYWY4MzNhM2Y3ZTc0YTU2MDQ3NTA1ODVkNmU2NTk1YzgyODAxNmVkYTBhYTQwYWNhYmQyNzg3MzU2NzA0NDBjMyJ9",  # 👈 替换为你的 Cookie
        "-H","Origin: https://pro.lceda.cn",
        "-H","Referer: https://pro.lceda.cn/editor",
        "-H","User-Agent: Mozilla/5.0",
        "-H","X-Requested-With: XMLHttpRequest"
    ]

    # 5) 循环查询
    for rec in records:
        pc, qty, on = rec["pc"], rec["qty"], rec["on"]
        print(f"🔍 查询 {pc} …")
        cmd = CURL_BASE + ["--data-raw", json.dumps({"codes":pc}, ensure_ascii=False)]
        res = subprocess.run(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True)
        o = json.loads(res.stdout)
        prod = o["result"]["productList"][0]

        # 提取字段
        code = prod.get("code","")
        name = prod.get("name","")
        brand = prod.get("brandName","")
        cat_cn = (prod.get("tags",{}).get("parent_tag",{}).get("name_cn")
                  or prod.get("tags",{}).get("child_tag",{}).get("name_cn")
                  or prod.get("catalogName","") )
        std = prod.get("standard","")
        sr = prod.get("splitRatio","")
        p0 = prod.get("priceList",[{}])[0].get("price","")
        device_info = prod.get("device_info")
        desc = (
            prod.get("Description")
            or prod.get("attributes", {}).get("Description")
            or prod.get("desc")
            or (device_info.get("description") if isinstance(device_info, dict) else "")
        )

        # 增加一行
        md.append(f"| {code} | {name} | {brand} | {cat_cn} | {std} | {sr} | {qty} | {p0} | {desc} | {on} |")

        # 保存 JSON
        with open(os.path.join(output_dir, f"{pc}.json"), "w", encoding="utf-8") as jf:
            jf.write(res.stdout)
        time.sleep(0.5)

    # 6) 写入 Markdown 文件
    out_md = f"pc_summary_{start_time}.md"
    with open(out_md, "w", encoding="utf-8") as mf:
        mf.write("\n".join(md))
    print(f"\n✅ 查询完成，已生成表格：{out_md}")

# 7. 退出按钮绑定
def exit_and_query():
    print("👋 程序退出，开始生成物料表…")
    cap.release()
    root.destroy()
    run_query_on_exit()

btn.config(command=exit_and_query)
root.protocol("WM_DELETE_WINDOW", exit_and_query)

# 8. 启动循环
update_frame()
root.mainloop()

