# -*- coding: utf-8 -*-
"""Trích gọn 01–08 của mọi job Base đã tải → bảng JSON + in bảng tóm tắt."""
import io, os, re, json, glob

TMP = r"C:\Users\admin\AppData\Local\Temp\base_jobs"
OUT = r"C:\Claw 2\QC\Base\du_lieu_base.json"
cards = json.load(open(os.path.join(TMP, "board_cards.json"), encoding="utf-8"))
STAGES = {"95344": "Thông tin không phù hợp", "95246": "Kiểm tra & xử lý sự cố",
          "95248": "QC & KT kiểm tra nguyên nhân gốc rễ", "95250": "GD duyệt kết quả báo cáo",
          "95252": "Theo dõi tình trạng", "98799": "Theo dõi - nghiên cứu",
          "95244": "Hoàn thành", "95245": "Thất bại"}
meta = {}
for st, items in cards.items():
    for x in items:
        t = re.sub(r"\s*\|\s*Không thời hạn.*$", "", x["title"]).strip()
        meta[x["job"]] = {"stage": st, "stage_ten": STAGES.get(st, st), "title": t, "cv": x["cv"]}

LABELS = {"Ngày kiểm tra", "Tên sản phẩm / tên màu", "Nội dung không đạt yêu cầu ·",
          "Nội dung không đạt yêu cầu", "Quy trình kiểm tra", "Kết quả kiểm tra",
          "Lượng chỉnh (sai màu / sai độ bóng)", "Sản phẩm đi kèm biên bản ·",
          "Yêu cầu hoặc đề xuất của tổ trưởng kỹ thuật", "Báo cáo chất lượng sản phẩm",
          "Báo cáo chất lượng hàng được xử lý", "Phuong án xử lý", "bước tiếp theo", "Đầu vào"}
STOP = {"Kết quả kiểm tra tại khách hàng", "Kết quả kiểm tra tại công ty", "QC & KT kiểm tra nguyên nhân gốc rễ",
        "GD duyệt kết quả báo cáo", "Theo dõi tình trạng", "Đầu vào", "Danh sách công việc"}

def clean(s):
    s = re.sub(r"!\[[^\]]*\]\([^)]*\)", " ", s)
    s = re.sub(r"\[([^\]]*)\]\([^)]*\)", r"\1", s)
    s = re.sub(r"[ \t]+", " ", s)
    s = re.sub(r"\n{2,}", "\n", s)
    return s.strip()

def field(block, num, nxt):
    m = re.search(rf"\n0*{num}\n(.+?)(?=\n0*{nxt}\n|\Z)", block, re.S)
    if not m:
        return ""
    v = clean(m.group(1))
    lines = [x.strip() for x in v.split("\n") if x.strip()]
    while lines and (lines[0] in LABELS or lines[-1] in STOP or lines[-1] in LABELS):
        lines = lines[1:] if lines[0] in LABELS else lines[:-1]
    return "\n".join(lines)

def table(block, num, nxt):
    """Đọc bảng markdown của trường `num` → list [cột...]."""
    raw = field(block, num, nxt)
    rows = []
    for line in raw.split("\n"):
        if line.startswith("|") and "---" not in line:
            cells = [c.strip() for c in line.strip("|").split("|")]
            rows.append(cells)
    return rows[1:] if rows else []

def parse(path, jid):
    t = io.open(path, encoding="utf-8").read()
    i1, i2 = t.find("Trường tuỳ chỉnh"), t.find("Danh sách công việc")
    block = clean(t[i1:i2]) if 0 < i1 < i2 else ""
    jobsec = t[t.find("Danh sách công việc"):]
    cvs = re.findall(r"\n([^\n!|]{3,90})\n!\[[^\]]*\]\([^)]*\)\n(Hoàn thành|Đang làm|Chưa làm[^\n]*)\n(Đã giao cho [^\n]+)", jobsec)
    nn = []
    for m3 in re.finditer(r"Nguyên nhân[^\n:]{0,25}:\s*([^\n]{5,200})", t):
        s = clean(m3.group(1))
        if s and s not in nn:
            nn.append(s)
    sp = field(block, 2, 3)
    loai = table(block, 3, 4)
    return {
        "job": jid, "file": os.path.basename(path), **meta.get(jid, {}),
        "ngay_kt": field(block, 1, 2),
        "san_pham": sp,
        "khach": sp.split("khách hàng")[1].strip().split("\n")[0] if "khách hàng" in sp else "",
        "loai_sai": [{"loai": (r[1] if len(r) > 1 else ""), "giai_thich": (r[2] if len(r) > 2 else "")} for r in loai],
        "quy_trinh": field(block, 4, 5)[:300],
        "ket_qua": field(block, 5, 6)[:300],
        "luong_chinh": field(block, 6, 7)[:150],
        "de_xuat": field(block, 8, 9)[:250],
        "nguyen_nhan": nn[:3],
        "cong_viec": [{"ten": c[0].strip(), "trang_thai": c[1].strip(),
                       "giao": c[2].replace("Đã giao cho ", "")} for c in cvs],
    }

files = sorted(glob.glob(os.path.join(TMP, "job_*.md")))
data = {}
for f in files:
    jid = re.search(r"job_(\d+)", f).group(1)
    data[jid] = parse(f, jid)
json.dump(data, open(OUT, "w", encoding="utf-8"), ensure_ascii=False, indent=1)
print(f"đã trích {len(data)} job → {OUT}\n")

for jid, d in sorted(data.items(), key=lambda x: x[1].get("stage", "")):
    ls = "; ".join((x["loai"] or "?").strip() for x in d["loai_sai"]) or "?"
    gt = " / ".join(x["giai_thich"][:150] for x in d["loai_sai"])[:200]
    print(f"[{d.get('stage_ten','?')[:22]:22}] {d.get('title','?')[:42]:44} | KT {d['ngay_kt'][:10]:10} | loại sai: {ls[:34]:36}")
    print(f"     mô tả: {gt}")
    print(f"     kết quả: {d['ket_qua'][:150].replace(chr(10),' ')}")
