import os
from docx import Document
from docx.shared import Pt, RGBColor, Inches
from docx.enum.text import WD_ALIGN_PARAGRAPH
from docx.enum.table import WD_TABLE_ALIGNMENT
from docx.oxml import OxmlElement, parse_xml
from docx.oxml.ns import nsdecls, qn

def set_cell_background(cell, color_hex):
    tcPr = cell._tc.get_or_add_tcPr()
    shd = parse_xml(f'<w:shd {nsdecls("w")} w:fill="{color_hex}"/>')
    tcPr.append(shd)

def set_cell_margins(cell, top=100, bottom=100, left=150, right=150):
    tcPr = cell._tc.get_or_add_tcPr()
    tcMar = OxmlElement('w:tcMar')
    for m, val in [('top', top), ('bottom', bottom), ('left', left), ('right', right)]:
        node = OxmlElement(f'w:{m}')
        node.set(qn('w:w'), str(val))
        node.set(qn('w:type'), 'dxa')
        tcMar.append(node)
    tcPr.append(tcMar)

def set_table_borders(table, color="CCCCCC", sz="4", val="single"):
    tblPr = table._tbl.tblPr
    borders = parse_xml(f'''
        <w:tblBorders {nsdecls("w")}>
            <w:top w:val="{val}" w:sz="{sz}" w:space="0" w:color="{color}"/>
            <w:bottom w:val="{val}" w:sz="{sz}" w:space="0" w:color="{color}"/>
            <w:left w:val="{val}" w:sz="{sz}" w:space="0" w:color="{color}"/>
            <w:right w:val="{val}" w:sz="{sz}" w:space="0" w:color="{color}"/>
            <w:insideH w:val="{val}" w:sz="{sz}" w:space="0" w:color="{color}"/>
            <w:insideV w:val="{val}" w:sz="{sz}" w:space="0" w:color="{color}"/>
        </w:tblBorders>
    ''')
    tblPr.append(borders)

def format_run(run, font_name='Times New Roman', size_pt=11, bold=False, italic=False, color_rgb=None):
    run.font.name = font_name
    run.font.size = Pt(size_pt)
    run.bold = bold
    run.italic = italic
    if color_rgb:
        run.font.color.rgb = color_rgb

def add_styled_paragraph(doc, text="", style='Normal', align=WD_ALIGN_PARAGRAPH.LEFT, space_before=0, space_after=6, line_spacing=1.15):
    p = doc.add_paragraph(style=style)
    p.alignment = align
    p.paragraph_format.space_before = Pt(space_before)
    p.paragraph_format.space_after = Pt(space_after)
    p.paragraph_format.line_spacing = line_spacing
    if text:
        run = p.add_run(text)
        format_run(run)
    return p

def main():
    doc = Document()
    
    # Configure margins
    section = doc.sections[0]
    section.top_margin = Inches(1)
    section.bottom_margin = Inches(1)
    section.left_margin = Inches(1)
    section.right_margin = Inches(1)
    
    # Header block
    p = add_styled_paragraph(doc, "CÔNG TY TNHH SX-TM HOÁ KEO BÌNH THẠNH", align=WD_ALIGN_PARAGRAPH.CENTER)
    p.runs[0].bold = True
    p.runs[0].font.size = Pt(12)
    
    p = add_styled_paragraph(doc, "(BT CHEM)\n— — —\nPHÒNG QC", align=WD_ALIGN_PARAGRAPH.CENTER)
    p.runs[0].font.size = Pt(11)
    p.runs[0].bold = True
    
    # Report Title
    p_title = doc.add_paragraph()
    p_title.alignment = WD_ALIGN_PARAGRAPH.CENTER
    p_title.paragraph_format.space_before = Pt(16)
    p_title.paragraph_format.space_after = Pt(12)
    run_title = p_title.add_run("BÁO CÁO PHÂN TÍCH SỰ CỐ CHẤT LƯỢNG MÀNG SƠN")
    format_run(run_title, size_pt=16, bold=True, color_rgb=RGBColor(0, 51, 102))
    
    p_sub = add_styled_paragraph(doc, "Mã màu: VNHW 7499 C — Đơn vị khiếu nại: Gia Đình Việt Nam", align=WD_ALIGN_PARAGRAPH.CENTER)
    p_sub.runs[0].font.size = Pt(11.5)
    p_sub.runs[0].italic = True
    
    doc.add_paragraph() # spacing

    # 1. Thông tin chung
    h1 = doc.add_paragraph()
    h1.paragraph_format.space_before = Pt(12)
    h1.paragraph_format.space_after = Pt(6)
    run_h1 = h1.add_run("I. THÔNG TIN CHUNG")
    format_run(run_h1, size_pt=13, bold=True, color_rgb=RGBColor(0, 51, 102))
    
    # General Info Table
    table_info = doc.add_table(rows=6, cols=2)
    table_info.alignment = WD_TABLE_ALIGNMENT.CENTER
    set_table_borders(table_info)
    
    info_data = [
        ("Khách hàng khiếu nại", "CÔNG TY CỔ PHẦN ĐỒ DÙNG GIA ĐÌNH VIỆT NAM (Gia Đình Việt Nam / UOS - 11474733)"),
        ("Mã số màu / Hệ sơn", "VNHW 7499 C / Sơn hệ NC (Indoor)"),
        ("Loại cốt sản phẩm", "MDF"),
        ("Ngày tiếp nhận khiếu nại", "21/07/2026"),
        ("Nhân sự QC phụ trách", "Nguyễn Anh Trí (Bộ phận QC1)"),
        ("Nội dung khiếu nại", "Màng sơn trên bề mặt sản phẩm xuất hiện đốm thâm màu xanh đen/xám gây mất thẩm mỹ.")
    ]
    
    for idx, (label, val) in enumerate(info_data):
        row = table_info.rows[idx]
        cell_lbl, cell_val = row.cells[0], row.cells[1]
        
        p_lbl = cell_lbl.paragraphs[0]
        p_lbl.paragraph_format.space_after = Pt(4)
        run_lbl = p_lbl.add_run(label)
        format_run(run_lbl, bold=True, size_pt=10)
        set_cell_background(cell_lbl, "F2F2F2")
        set_cell_margins(cell_lbl, top=60, bottom=60, left=100, right=100)
        
        p_val = cell_val.paragraphs[0]
        p_val.paragraph_format.space_after = Pt(4)
        run_val = p_val.add_run(val)
        format_run(run_val, size_pt=10)
        set_cell_margins(cell_val, top=60, bottom=60, left=100, right=100)
        
    doc.add_paragraph()

    # 2. Hình ảnh sự cố khiếu nại
    h2 = doc.add_paragraph()
    h2.paragraph_format.space_before = Pt(12)
    h2.paragraph_format.space_after = Pt(6)
    run_h2 = h2.add_run("II. HÌNH ẢNH SỰ CỐ KHÁCH HÀNG KHIẾU NẠI")
    format_run(run_h2, size_pt=13, bold=True, color_rgb=RGBColor(0, 51, 102))
    
    p_desc = add_styled_paragraph(doc, "Dưới đây là hình ảnh khuyết tật thực tế trên màng sơn do khách hàng phản hồi (Đốm màu xanh đen/tạp chất thâm trong lớp sơn):")
    p_desc.paragraph_format.space_after = Pt(8)
    
    # Embed image
    img_path = r"C:\Users\pc\.gemini\antigravity\brain\7dd5cd1a-056c-4ff3-a340-c0b19d15dbbf\media__1784647293573.png"
    if os.path.exists(img_path):
        p_img = doc.add_paragraph()
        p_img.alignment = WD_ALIGN_PARAGRAPH.CENTER
        p_img.paragraph_format.space_after = Pt(8)
        run_img = p_img.add_run()
        run_img.add_picture(img_path, width=Inches(5.0))
        p_caption = add_styled_paragraph(doc, "Hình 1: Đốm thâm đen bất thường trên bề mặt sản phẩm sơn VNHW 7499 C", align=WD_ALIGN_PARAGRAPH.CENTER)
        p_caption.runs[0].font.size = Pt(9.5)
        p_caption.runs[0].italic = True
    else:
        p_err = add_styled_paragraph(doc, "[Hình ảnh lỗi không tìm thấy tại đường dẫn hệ thống]", align=WD_ALIGN_PARAGRAPH.CENTER)
        p_err.runs[0].font.color.rgb = RGBColor(255, 0, 0)
        
    doc.add_paragraph()

    # 3. Đối chiếu kết quả QC thực tế
    h3 = doc.add_paragraph()
    h3.paragraph_format.space_before = Pt(12)
    h3.paragraph_format.space_after = Pt(6)
    run_h3 = h3.add_run("III. ĐỐI CHIẾU VỚI KẾT QUẢ KIỂM TRA MẪU CỦA QC")
    format_run(run_h3, size_pt=13, bold=True, color_rgb=RGBColor(0, 51, 102))
    
    p_qc_desc = add_styled_paragraph(doc, "Tiến hành đối chiếu với nhật ký kiểm tra mẫu thử nghiệm màu VNHW 7499 C thực hiện từ ngày 18/07/2026 đến ngày 21/07/2026 tại phòng thí nghiệm Bình Thạnh:")
    
    # Viscosity and ratio table
    table_qc = doc.add_table(rows=4, cols=4)
    table_qc.alignment = WD_TABLE_ALIGNMENT.CENTER
    set_table_borders(table_qc)
    
    qc_headers = ["STT", "Loại sơn / Hóa chất", "Tỷ lệ pha (Sơn : Cứng : Dung môi)", "Độ nhớt đo được (giây)"]
    qc_rows = [
        ("1", "Lót PU 2802 Trắng MH", "2 : 1 : 1", "13\"12"),
        ("2", "Lót màu NC", "1 : 1", "13\"28"),
        ("3", "Sơn màu NC 30%", "1 : 1", "13\"12")
    ]
    
    # Format Headers
    for col_idx, text in enumerate(qc_headers):
        cell = table_qc.rows[0].cells[col_idx]
        p = cell.paragraphs[0]
        p.paragraph_format.space_after = Pt(4)
        run = p.add_run(text)
        format_run(run, bold=True, size_pt=10)
        set_cell_background(cell, "D9E1F2")
        set_cell_margins(cell, top=60, bottom=60, left=100, right=100)
        
    # Format Rows
    for row_idx, data in enumerate(qc_rows):
        row = table_qc.rows[row_idx + 1]
        for col_idx, text in enumerate(data):
            cell = row.cells[col_idx]
            p = cell.paragraphs[0]
            p.paragraph_format.space_after = Pt(4)
            run = p.add_run(text)
            format_run(run, size_pt=9.5)
            set_cell_margins(cell, top=60, bottom=60, left=100, right=100)
            
    p_qc_res = add_styled_paragraph(doc, "\n* Nhận xét kết quả mẫu thử QC: Cả 3 phôi mẫu gỗ MDF phun thử nghiệm thực tế tại phòng QC đều đạt độ bóng yêu cầu, màng sơn láng mịn hoàn toàn, KHÔNG có hiện tượng đốm đen thâm hay lỗi bề mặt. Do đó, công thức pha sơn gốc và quy trình phun của QC hoàn toàn ổn định.")
    p_qc_res.runs[0].italic = True

    # Embed successful test image
    img_ok_path = r"C:\Users\pc\.gemini\antigravity\brain\7dd5cd1a-056c-4ff3-a340-c0b19d15dbbf\media__1784647544556.jpg"
    if os.path.exists(img_ok_path):
        p_img_ok = doc.add_paragraph()
        p_img_ok.alignment = WD_ALIGN_PARAGRAPH.CENTER
        p_img_ok.paragraph_format.space_before = Pt(6)
        p_img_ok.paragraph_format.space_after = Pt(6)
        run_img_ok = p_img_ok.add_run()
        run_img_ok.add_picture(img_ok_path, width=Inches(4.5))
        p_ok_caption = add_styled_paragraph(doc, "Hình 2: Phôi mẫu gỗ MDF thử nghiệm đạt tiêu chuẩn, láng mịn tại phòng QC", align=WD_ALIGN_PARAGRAPH.CENTER)
        p_ok_caption.runs[0].font.size = Pt(9.5)
        p_ok_caption.runs[0].italic = True
    
    doc.add_paragraph()

    # 4. Phân tích nguyên nhân sự cố
    h4 = doc.add_paragraph()
    h4.paragraph_format.space_before = Pt(12)
    h4.paragraph_format.space_after = Pt(6)
    run_h4 = h4.add_run("IV. PHÂN TÍCH NGUYÊN NHÂN SỰ CỐ (ROOT CAUSE)")
    format_run(run_h4, size_pt=13, bold=True, color_rgb=RGBColor(0, 51, 102))
    
    causes = [
        "Do thiết bị phun sơn chưa vệ sinh kỹ: Súng phun sơn, cốc chứa hoặc hệ thống dẫn sơn còn dính cặn sơn màu sẫm (xanh lá, đen, đỏ...) từ mẻ phun trước đó. Khi chuyển sang sơn màu vàng sáng VNHW 7499 C, cặn sơn này tan ra tạo thành đốm thâm đen.",
        "Do nguồn khí nén lẫn hơi nước hoặc dầu: Bộ lọc khí nén bị bẩn, không lọc sạch được hơi dầu máy nén khí, dẫn đến giọt dầu bắn lẫn vào màng sơn tạo thành vết loang ố tối màu.",
        "Do không lọc sơn trước khi đưa vào súng: Công nhân bỏ qua khâu lọc sơn qua lưới lọc chuyên nghiệp, khiến các cặn màu chưa phân tán hoàn toàn đọng lại trên bề mặt màng sơn.",
        "Do bụi bẩn từ môi trường nhà xưởng: Bông vải, bụi bẩn cơ học màu đậm bay tự do trong khu vực sơn bám trực tiếp vào màng sơn còn ướt."
    ]
    for c in causes:
        p_c = doc.add_paragraph(style='List Bullet')
        p_c.paragraph_format.space_after = Pt(4)
        run_c = p_c.add_run(c)
        format_run(run_c, size_pt=10.5)

    doc.add_paragraph()

    # 5. Biện pháp khắc phục và phòng ngừa
    h5 = doc.add_paragraph()
    h5.paragraph_format.space_before = Pt(12)
    h5.paragraph_format.space_after = Pt(6)
    run_h5 = h5.add_run("V. BIỆN PHÁP KHẮC PHỤC & PHÒNG NGỪA (CAR)")
    format_run(run_h5, size_pt=13, bold=True, color_rgb=RGBColor(0, 51, 102))
    
    p_rep = add_styled_paragraph(doc, "Biện pháp khắc phục tức thời:")
    p_rep.runs[0].bold = True
    p_rep_det = doc.add_paragraph(style='List Bullet')
    p_rep_det.paragraph_format.space_after = Pt(4)
    run_rep = p_rep_det.add_run("Xả nhám cục bộ sản phẩm bị lỗi màng sơn đến hết lớp lót trắng, vệ sinh sạch bụi nhám và thực hiện phun dặm lại lớp lót màu NC và phủ bóng theo đúng quy trình.")
    format_run(run_rep, size_pt=10.5)
    
    p_prev = add_styled_paragraph(doc, "Biện pháp phòng ngừa lâu dài:")
    p_prev.runs[0].bold = True
    
    prev_actions = [
        "Quy định nghiêm ngặt vệ sinh súng phun sơn: Rửa sạch súng và cốc súng sơn bằng dung môi sạch ít nhất 2 lần khi đổi từ hệ sơn màu đậm sang sơn màu sáng.",
        "Bắt buộc lọc sơn: Toàn bộ sơn màu sáng phải lọc qua lưới lọc sơn chuyên dụng trước khi đổ vào súng phun.",
        "Bảo dưỡng hệ thống lọc khí: Thực hiện xả nước bình khí nén hàng ngày và thay thế lõi lọc tách dầu/nước định kỳ hàng tuần.",
        "Cải thiện vệ sinh phòng sơn: Quét dọn, làm sạch bụi bẩn quanh khu vực phun sơn và đóng kín cửa phòng phun sơn để tránh gió lùa mang theo bụi cơ học."
    ]
    for pa in prev_actions:
        p_pa = doc.add_paragraph(style='List Bullet')
        p_pa.paragraph_format.space_after = Pt(4)
        run_pa = p_pa.add_run(pa)
        format_run(run_pa, size_pt=10.5)

    # Spacing for signatures
    doc.add_paragraph()
    doc.add_paragraph()
    doc.add_paragraph()

    # Signatures
    table_sig = doc.add_table(rows=1, cols=2)
    table_sig.alignment = WD_TABLE_ALIGNMENT.CENTER
    set_table_borders(table_sig, val="none") # Hide borders
    
    sig_titles = [
        "QC LẬP BÁO CÁO\n(Ký và ghi rõ họ tên)\n\n\n\nNguyễn Anh Trí",
        "DUYỆT BỞI BAN GIÁM ĐỐC\n(Ký và ghi rõ họ tên)\n\n\n\nBan Giám Đốc"
    ]
    
    for i, title_text in enumerate(sig_titles):
        cell = table_sig.rows[0].cells[i]
        p_s = cell.paragraphs[0]
        p_s.alignment = WD_ALIGN_PARAGRAPH.CENTER
        run_s = p_s.add_run(title_text)
        format_run(run_s, size_pt=10, bold=True)
        set_cell_margins(cell, top=100, bottom=100, left=150, right=150)

    # Save Document
    out_dir = r"c:\antigra-DS\CLAW_LAM_VIEC\QC\Bao cao"
    os.makedirs(out_dir, exist_ok=True)
    out_path = os.path.join(out_dir, "Bao_cao_su_co_mau_VNHW_7499C_hoan_thien.docx")
    doc.save(out_path)
    print(f"Successfully generated DOCX report at: {os.path.abspath(out_path)}")

if __name__ == '__main__':
    main()
