# -*- coding: utf-8 -*-
"""Sơ đồ minh hoạ cho báo cáo sự cố tróc sơn — Đăng Long (DL 16/19)."""
import os
import matplotlib
matplotlib.use("Agg")
import matplotlib.pyplot as plt
from matplotlib.patches import FancyBboxPatch, FancyArrowPatch, Rectangle, Polygon, Circle
plt.rcParams["font.family"] = "Arial"
plt.rcParams["axes.unicode_minus"] = False

OUT = r"C:\Claw 2\QC\Base\Dang-Long-troc-son\img"
os.makedirs(OUT, exist_ok=True)
BLUE, RED, GREEN, ORANGE, BROWN, DARK, GREY = "#1f4e79", "#c0392b", "#1e8449", "#d68910", "#8d6e63", "#34495e", "#95a5a6"
WOOD = "#e0c9a6"

def save(fig, name):
    p = os.path.join(OUT, name)
    fig.savefig(p, dpi=140, bbox_inches="tight", facecolor="white")
    plt.close(fig)
    print(f"  {name}: {os.path.getsize(p)//1024} KB")

# ============ D1 — MẶT CẮT HỆ SƠN & VỊ TRÍ TRÓC ============
fig, ax = plt.subplots(figsize=(12.4, 6.4))
ax.set_xlim(0, 14); ax.set_ylim(0, 9); ax.axis("off")
ax.set_title("Mặt cắt hệ sơn màu DL 16/19 và vị trí màng bị tróc (theo báo cáo QC 04–05/09/2026)",
             fontsize=12.6, fontweight="bold", color=BLUE)

layers = [
    ("Lớp bóng NC HB 10%", "#2e86c1", 0.75),
    ("Glaze màu (dặm)", "#af7ac5", 0.5),
    ("Lót NC HB", "#5dade2", 0.7),
    ("Glaze màu (lau/kéo cọ)", "#af7ac5", 0.5),
    ("Lót màu NC DL 16/19 — 2 paths", "#f4d03f", 0.85),
    ("Lót màu NC DL 16/19 — 1 path", "#f7dc6f", 0.8),
    ("Lót PU (2-1-2)", "#f0b27a", 0.75),
]
y = 2.0
for name, c, h in reversed(layers):        # vẽ từ dưới lên
    ax.add_patch(Rectangle((1.6, y), 7.6, h, facecolor=c, edgecolor="#566573", lw=1.0))
    ax.text(5.4, y + h / 2, name, ha="center", va="center", fontsize=8.6, color="#1b2631")
    ax.text(1.35, y + h / 2, "●", ha="right", va="center", fontsize=8, color=c)
    y += h + 0.06
ax.add_patch(Rectangle((1.6, 1.15), 7.6, 0.85, facecolor=WOOD, edgecolor=BROWN, lw=1.4))
ax.text(5.4, 1.57, "PHÔI MDF", ha="center", va="center", fontsize=9.4, color="#5d4037", fontweight="bold")

# vị trí tróc: từ lớp glaze trở lên
top = 2.0 + sum(h for _, _, h in layers) + 0.06 * len(layers)
glaze_bottom = 2.0 + 0.75 + 0.06 + 0.8 + 0.06 + 0.85 + 0.06   # đỉnh lớp lót màu NC
ax.add_patch(Rectangle((9.5, glaze_bottom), 0.55, top - glaze_bottom, facecolor=RED, alpha=0.25,
                       edgecolor=RED, lw=1.6))
ax.annotate("", xy=(9.5, glaze_bottom + (top - glaze_bottom) / 2), xytext=(10.4, glaze_bottom + 1.4),
            arrowprops=dict(arrowstyle="-|>", color=RED, lw=1.8))
ax.text(10.5, glaze_bottom + 1.5, "MÀNG BỊ TRÓC\n(từ lớp glaze trở lên)", fontsize=9.6, color=RED, fontweight="bold")
ax.text(10.5, glaze_bottom - 0.35, "còn lại lớp lót màu NC DL 16/19\nbám trên MDF", fontsize=9, color=GREEN)
ax.annotate("", xy=(9.3, glaze_bottom - 0.25), xytext=(10.4, glaze_bottom - 0.3),
            arrowprops=dict(arrowstyle="-|>", color=GREEN, lw=1.6))
ax.text(5.4, 8.6, "Thứ tự thi công theo quy trình thực tế của chuyền Pallet",
        ha="center", fontsize=9.6, color="#333333")
ax.text(12.9, 3.6, "→ Kết luận: bộ sơn đạt yêu cầu;\n   lỗi nằm ở LIÊN KẾT GIỮA CÁC LỚP\n   sau công đoạn glaze.",
        fontsize=9.2, color=BLUE, va="center")
save(fig, "D1_mat-cat-he-son.png")

# ============ D2 — HAI THÍ NGHIỆM ĐỐI CHỨNG ============
fig = plt.figure(figsize=(12.6, 6.0))
gs = fig.add_gridspec(1, 2, wspace=0.18)

def th(fig, ax, title, steps, result, ok):
    ax.set_xlim(0, 10); ax.set_ylim(0, 10); ax.axis("off")
    ax.set_title(title, fontsize=12.0, fontweight="bold", color=BLUE)
    for i, s in enumerate(steps):
        y = 8.5 - i * 1.15
        ax.add_patch(FancyBboxPatch((0.4, y - 0.42), 9.2, 0.9, boxstyle="round,pad=0.05",
                                    facecolor="#eef4fb" if ok else "#fdf2e9",
                                    edgecolor=BLUE if ok else ORANGE, lw=1.1))
        ax.text(0.65, y, s, fontsize=8.6, color="#222222", va="center")
    c = GREEN if ok else RED
    ax.add_patch(FancyBboxPatch((0.4, 0.5), 9.2, 1.25, boxstyle="round,pad=0.08",
                                facecolor="#eafaf1" if ok else "#fdecea", edgecolor=c, lw=1.8))
    ax.text(5.0, 1.12, result, ha="center", va="center", fontsize=10.4, color=c, fontweight="bold")

th(fig, fig.add_subplot(gs[0, 0]),
   "Thí nghiệm 1 — quy trình CHUẨN (thực tế chuyền)",
   ["1. Lót PU (2-1-2) → 2 giờ → chà #320",
    "2. Lót màu NC DL 16/19 — 1 path → 1 giờ → chà #320",
    "3. Lót màu NC DL 16/19 — 2 paths → trên 2 giờ",
    "4. Glaze màu: DLO 27C (1-4 Pegasol) và DLO 16/19 (1-2)\n     → kéo cọ sạch → khô tự nhiên 30 phút",
    "5. Lót NC HB (1-1,5) → 1,5 giờ → chà #320",
    "6. Glaze màu dặm giống mẫu → 30 phút",
    "7. Bóng NC HB 10% (1-1,5)"],
   "Để khô 20 giờ → cắt carô giật băng keo: 4B/5B — ĐẠT", True)

th(fig, fig.add_subplot(gs[0, 1]),
   "Thí nghiệm 2 — PHUN GIÓ LỚN + glaze chưa đủ thời gian",
   ["1–3. Giống quy trình chuẩn",
    "4. Phun GLAZE MÀU trong điều kiện gió lớn",
    "5. Sau 5–10 phút đã thực hiện tiếp công đoạn sau\n     (glaze chưa đủ thời gian bay hơi dung môi)",
    "6. Lót NC HB",
    "7. Bóng NC HB 10%"],
   "Để khô 20 giờ → giật băng keo: BONG TRÓC,\ncòn lại lớp lót màu NC — KHÔNG ĐẠT", False)
fig.text(0.5, -0.03, "Hai thí nghiệm chạy song song trên cùng nguyên liệu kho Đăng Long và phôi MDF tại Đăng Long "
                     "→ tái hiện đúng hiện tượng lỗi của lô 200 hộc kéo.",
         ha="center", fontsize=9.6, color=RED, style="italic")
save(fig, "D2_hai-thi-nghiem.png")

# ============ D3 — DÒNG THỜI GIAN HỒ SƠ ============
fig, ax = plt.subplots(figsize=(12.6, 4.6))
ax.set_xlim(0, 14); ax.set_ylim(0, 5); ax.axis("off")
ax.set_title("Dòng thời gian xử lý sự cố tróc sơn — màu DL 16/19, khách Đăng Long",
             fontsize=12.6, fontweight="bold", color=BLUE)
ax.annotate("", xy=(13.6, 2.5), xytext=(0.4, 2.5), arrowprops=dict(arrowstyle="-|>", color="#555555", lw=2.2))
events = [
    (1.3, "28/08/2026", "Kỹ thuật Đen + KT Chinh\nbáo sự cố tại nhà máy\n(200 hộc kéo, test ~3/10)", ORANGE),
    (4.3, "29/08/2026", "Phiếu thông tin không phù hợp\n+ hồ sơ Base: kiểm 10 SP,\n3 SP tróc sơn", RED),
    (7.3, "03–04/09/2026", "Trí QC kiểm tra tại\nBình Thạnh (mẫu lưu QC)\ntìm nguyên nhân công đoạn", BLUE),
    (10.3, "04–05/09/2026", "Lộc QC kiểm tra tại Đăng Long\n(nguyên liệu + phôi tại nhà máy)\n→ tái hiện nguyên nhân", BLUE),
    (13.0, "Kết quả", "Chuẩn: 4B/5B ĐẠT\nGió lớn + glaze sớm:\nKHÔNG ĐẠT", GREEN),
]
for x, date, desc, c in events:
    ax.plot([x], [2.5], marker="o", markersize=11, color=c)
    ax.plot([x, x], [2.5, 3.4 if x in (1.3, 4.3, 7.3) else 1.6], color=c, lw=1.2, linestyle=":")
    ax.text(x, 3.55 if x in (1.3, 4.3, 7.3) else 1.45, date, ha="center",
            fontsize=9.6, fontweight="bold", color=c)
    ax.text(x, 4.5 if x in (1.3, 4.3, 7.3) else 0.35, desc, ha="center", fontsize=8.6, color="#333333")
save(fig, "D3_dong-thoi-gian.png")
print("\nXong 3 sơ đồ.")
