# -*- coding: utf-8 -*-
"""B27: dựng 1 DOCX tổng hợp TẤT CẢ tài liệu sơn UV trong Claw 2:
  Phần 1 Hướng dẫn lựa chọn & sử dụng · Phần 2 Danh mục sản phẩm theo nhóm ·
  Phần 3 Chi tiết công thức từng sản phẩm (mọi file có bảng nguyên liệu) ·
  Phần 4 Sơn UV không màu lăn trục (27/08/2026) · Phần 5 Mã màu UV · Phần 6 Nguồn."""
import glob, os, re
from docx import Document
from docx.shared import Pt, Cm, RGBColor
from docx.enum.text import WD_ALIGN_PARAGRAPH

GOC = r'C:\Claw 2\Nghien cuu\CONTHUCUV'
OUT = r'C:\Claw 2\Nghien cuu\CONTHUCUV\DANH-MUC-SAN-PHAM-SON-UV_10-10-2026.docx'

d = Document()
st = d.styles['Normal']
st.font.name = 'Arial'
st.font.size = Pt(10.5)
for s in d.sections:
    s.left_margin = s.right_margin = Cm(1.7)


EMOJI = re.compile(r'[\U0001F000-\U0001FAFF\U00002600-\U000027BF\U0001F1E6-\U0001F1FF\uFE0F\u2705\u274C\u26A0]')


def sach(t):
    t = EMOJI.sub('', str(t))
    t = re.sub(r'\[([^\]]+)\]\([^)]*\)', r'\1', t)     # bỏ link markdown, giữ chữ
    t = t.replace('**', '').replace('__', '')
    return re.sub(r'\s{2,}', ' ', t).strip()


def dep(p):
    for r in p.runs:
        r.font.name = 'Arial'
        r.font.size = Pt(10.5)
        r.font.color.rgb = RGBColor(0, 0, 0)
    return p


def T(t, cap=1):
    return dep(d.add_heading(sach(t), level=cap))


def P(t='', bold=False, center=False):
    p = d.add_paragraph()
    if center:
        p.alignment = WD_ALIGN_PARAGRAPH.CENTER
    r = p.add_run(sach(t)); r.bold = bold
    return dep(p)


def bullet(t):
    return dep(d.add_paragraph(sach(t), style='List Bullet'))


def bang(hang):
    """hang = list of list (hàng đầu là header); đoạn văn giữ chữ thường, in đậm header"""
    if not hang:
        return
    ncot = max(len(r) for r in hang)
    tb = d.add_table(rows=0, cols=ncot)
    try:
        tb.style = 'Table Grid'
    except Exception:
        pass
    for i, row in enumerate(hang):
        o = tb.add_row().cells
        for j in range(ncot):
            txt = sach(row[j] if j < len(row) else '')
            o[j].text = ''
            r = o[j].paragraphs[0].add_run(txt)
            r.bold = (i == 0)
            r.font.name = 'Arial'
            r.font.size = Pt(9.5)
            r.font.color.rgb = RGBColor(0, 0, 0)


def md_vao(text, cap_goc=2):
    """markdown đơn giản -> docx: #/##/###, bảng |, bullet -, đoạn thường"""
    dong = text.split('\n')
    i = 0
    while i < len(dong):
        l = dong[i].rstrip()
        if not l.strip():
            i += 1; continue
        if l.startswith('|') and i + 1 < len(dong) and re.match(r'^\|[\s:\-|]+\|$', dong[i + 1].strip()):
            hang = []
            while i < len(dong) and dong[i].strip().startswith('|'):
                o = [x.strip() for x in dong[i].strip().strip('|').split('|')]
                if not re.match(r'^[\s:\-]+$', ''.join(o)):
                    hang.append(o)
                i += 1
            bang(hang)
            continue
        if l.startswith('#'):
            lv = len(l) - len(l.lstrip('#'))
            t = l.lstrip('#').strip()
            t = re.sub(r'\[([^\]]+)\]\([^)]*\)', r'\1', t)
            T(t, min(4, cap_goc + lv - 1))
            i += 1; continue
        if re.match(r'^\s*[-*✅❌⚠️]\s+', l):
            bullet(re.sub(r'^\s*[-*✅❌⚠️]+\s+', '', l).strip())
            i += 1; continue
        P(re.sub(r'\[([^\]]+)\]\([^)]*\)', r'\1', l).replace('**', '').strip())
        i += 1


# ══ TIÊU ĐỀ
P('CÔNG TY TNHH SX TM HÓA KEO BÌNH THẠNH — PHÒNG KỸ THUẬT', bold=True, center=True)
P('DANH MỤC SẢN PHẨM SƠN UV — ỨNG DỤNG & HƯỚNG DẪN CHI TIẾT', bold=True, center=True)
P('Ngày lập: 10/10/2026 · Nguồn: tài liệu kỹ thuật trong C:\\Claw 2\\Nghien cuu (CONTHUCUV, TDS\\UV)', center=True)
P()

# ══ PHẦN 1 — HƯỚNG DẪN
T('PHẦN 1. HƯỚNG DẪN LỰA CHỌN VÀ SỬ DỤNG SƠN UV')
md_vao(open(os.path.join(GOC, 'Huong_dan_lua_chon_son_UV.md'), encoding='utf-8').read())

# ══ PHẦN 2 — DANH MỤC SẢN PHẨM THEO NHÓM
T('PHẦN 2. DANH MỤC SẢN PHẨM UV THEO NHÓM (ỨNG DỤNG TỪNG LOẠI)')
md_vao(open(os.path.join(GOC, 'Danh muc cong thuc UV.md'), encoding='utf-8').read())

# ══ PHẦN 3 — CHI TIẾT CÔNG THỨC
T('PHẦN 3. CHI TIẾT CÔNG THỨC TỪNG SẢN PHẨM (NGUYÊN LIỆU & KHỐI LƯỢNG PHẦN)')
bo_qua = {'danh muc cong thuc uv.md', 'danh_sach_mau_uv.md', 'huong_dan_lua_chon_son_uv.md',
          'danh muc nguyen lieu uv.md', 'prompt.txt'}
files = sorted(glob.glob(os.path.join(GOC, '*.md')))
n_ct = 0
for f in files:
    ten = os.path.basename(f)
    if ten.lower() in bo_qua:
        continue
    txt = open(f, encoding='utf-8', errors='replace').read()
    if not re.search(r'\|\s*(Nguyên liệu|STT)', txt):
        continue                                     # chỉ lấy file có bảng công thức
    T(ten.replace('.md', '').replace('_', ' '), 2)
    md_vao(txt, 3)
    n_ct += 1
P()
P('Tổng số công thức chi tiết: %d' % n_ct, bold=True)

# ══ PHẦN 4 — SƠN UV KHÔNG MÀU LĂN TRỤC (bản 27/08/2026)
T('PHẦN 4. SƠN UV KHÔNG MÀU — LOẠI LĂN TRỤC (bản lập 27/08/2026)')
P('1. Sơn lót UV (Sealer) — không màu, lăn trục', bold=True)
bang([['Mã sản phẩm', 'Đặc điểm', 'Ứng dụng'],
      ['BTUV 2008', 'Đa năng, chà nhám tốt', 'Sơn lót thông dụng cho nội thất'],
      ['BT_UV 2011 HP', 'Độ trong cao, ngăn dầu', 'Yêu cầu thẩm mỹ cao, giữ màu gỗ tự nhiên'],
      ['BTUV 0711', 'Chuyên dụng, chịu lực tốt', 'Ván sàn (bản VT — tăng bám dính sàn gỗ Vĩnh Tiến)'],
      ['BTUV 2005', 'Lót mờ', 'Tạo bề mặt mịn mờ, giảm chói'],
      ['BTUV 1403', 'Tăng chống mài mòn', 'Nơi có lưu lượng đi lại cao']])
P('2. Sơn bóng UV (Topcoat) — không màu, lăn trục', bold=True)
bang([['Mã sản phẩm', 'Đặc điểm', 'Ứng dụng'],
      ['BTUV 2407 (Clear PHT)', 'Bóng, chống biến màu sau sấy', 'Màu sáng, yêu cầu giữ màu lâu dài'],
      ['BTUV 2407 Matte PHT', 'Bóng mờ, chống biến màu', 'Bề mặt mờ, giữ màu lâu dài'],
      ['BTUV 0510', 'Bóng ván sàn, chịu mài mòn', 'Mặt sàn, chịu mài mòn cao'],
      ['BTUV 0609', 'Bóng thông dụng (PHT)', 'Nội thất thông thường']])
P('3. Sơn Primer UV — không màu', bold=True)
bang([['Mã sản phẩm', 'Đặc điểm', 'Ứng dụng'],
      ['BTUV PRIMER 01 GT', 'Ngăn dầu', 'Gỗ tràm, gỗ thông nhiều dầu'],
      ['BT_UV 1508', 'Bám dính đa năng', 'Kim loại, nhựa ABS']])
P('Ghi chú — các mã loại trừ (không thuộc lăn trục):', bold=True)
for x in ['BT UV SPR 1010: bóng dùng súng phun (thi công phun, không phải lăn trục).',
          'BT_UV 2106 V / BTUV 0806 WV: sealer phun cạnh máy hút chân không (vacuum).',
          'Sơn UV có màu (trắng, đen, hệ màu), Filler, phụ gia (BV1711, CCN, CTC, PG 6020, DL UV 01…) không nằm trong danh mục sơn không màu này.',
          'BTUV 127 Floor Sealer (siêu cứng): đang thử nghiệm thay thế nguyên liệu, CHƯA chốt đưa vào danh mục.']:
    bullet(x)

# ══ PHẦN 5 — MÃ MÀU
T('PHẦN 5. DANH SÁCH MÃ MÀU SƠN UV')
md_vao(open(os.path.join(GOC, 'Danh_sach_Mau_UV.md'), encoding='utf-8').read(), 3)

# ══ PHẦN 6 — NGUỒN
T('PHẦN 6. NGUỒN TÀI LIỆU TRONG C:\\Claw 2 (để tra cứu lại)')
for x in [r'C:\Claw 2\Nghien cuu\CONTHUCUV\  — danh mục + %d công thức sản phẩm UV (.md)' % n_ct,
          r'C:\Claw 2\Nghien cuu\CONTHUCUV\Huong_dan_lua_chon_son_UV.md — hướng dẫn lựa chọn & sử dụng',
          r'C:\Claw 2\Nghien cuu\CONTHUCUV\Danh_muc_son_UV_khong_mau_lan_truc_2026-08-27.docx — danh mục lăn trục (bản 27/08)',
          r'C:\Claw 2\Nghien cuu\CONTHUCUV\Danh_sach_Mau_UV.md — mã màu UV',
          r'C:\Claw 2\Nghien cuu\CONTHUCUV\Danh muc nguyen lieu UV.md — nguyên liệu UV (19.919 B)',
          r'C:\Claw 2\Nghien cuu\TDS\UV\Tong hop nguyen lieu UV.md — tổng hợp nguyên liệu UV + TDS Wangsan (SW107/515/525/6623)',
          r'C:\Claw 2\Nghien cuu\UV MEKONG\ (MK-UV CLEAR TOP · MK-UVMATT TOP · MK-UV SEALER .xlsx)',
          r'C:\Claw 2\Nghien cuu\UV_Formulator_App\ — app pha chế UV (UV_Formulator.exe + bản HTML)']:
    bullet(x)

d.save(OUT)

# ══ KIỂM
d2 = Document(OUT)
toan = '\n'.join(p.text for p in d2.paragraphs) + '\n' + '\n'.join(
    c.text for t in d2.tables for r in t.rows for c in r.cells)
emoji = re.findall(r'[\U0001F000-\U0001FAFF\U00002600-\U000027BF]', toan)
print('  OUT:', OUT)
print('  %d B | %d đoạn | %d bảng | emoji %d' % (os.path.getsize(OUT), len(d2.paragraphs), len(d2.tables), len(emoji)))
print('  công thức chi tiết: %d' % n_ct)
for k in ['BTUV 2008', 'BT_UV 2011 HP', 'BTUV 2407', 'BTUV 0510', 'BTUV 2703', 'BTUV PRIMER 01 GT',
          'Paste white UV 1112', 'BT UV 2711', 'BV1711', 'CTC', 'PG 6020', 'Vàng cam 2RA', 'ĐEN MA 100']:
    print('   %-24s %s' % (k, 'có' if k in toan else 'THIẾU'))
