# -*- coding: utf-8 -*-
"""HOÀN THIỆN CSDLA: bổ sung 9 bước quan trọng khác của quy trình sơn gỗ (nguồn quốc tế, tra bằng Chrome thật).

Bước mới 26-34:
  A. Tiền xử lý bề mặt mộc : 26 keo tràn · 27 độ ẩm & môi trường · 28 vá trám khuyết tật · 29 trét lấp mắt gỗ · 30 nâng thớ–khử xù · 31 chống loang màu
  B. Giữa các lớp         : 32 khử bụi–lau tack · 33 chà nhám giữa lớp (hạt bụi)
  C. Hoàn thiện cuối      : 34 đánh bóng–miết bóng
"""
import os, re, shutil, sqlite3, time

D = r'C:\Claw 2\Nghien cuu\Du-an-A-Quy-trinh-son'
DB = os.path.join(D, 'CSDLA.db')
GERMANY = None

B = [
 (26, 'Kiểm tra & xử lý keo tràn', 'Glue Spot Removal', '去胶痕（除胶）',
  'Kiểm tra các vị trí keo dán tràn/dính trên bề mặt mộc (làm ướt bằng nước hoặc dung môi khoáng để nhìn rõ vết keo), sau đó cạo hoặc chà nhám loại bỏ trước khi sơn. '
  'Keo tràn ngăn cản sự thấm màu và tạo vết sáng/lệch màu sau khi lên màu. (Nguồn: Woodworker’s Journal — Finishing Flow Chart, 08/2005)'),
 (27, 'Kiểm soát độ ẩm gỗ & điều kiện môi trường', 'Wood Moisture & Environment Control', '木材含水率与环境控制',
  'Kiểm tra độ ẩm gỗ và điều kiện nhà xưởng TRƯỚC khi vào sơn: độ ẩm gỗ ≤ 12 %, nhiệt độ > 5 °C, độ ẩm không khí ≤ 85 % (theo kỹ thuật sơn phủ gỗ). '
  'Ảnh hưởng trực tiếp tới thời gian khô giữa lớp và hiện tượng mốc da/trắng màng sơn. Liên hệ thực tế BT CHEM: phiếu TW.REC-011 yêu cầu thêm phụ gia chậm khô (Retarder 5–7 %) khi nhiệt độ ≥ 35 °C & độ ẩm ≤ 60 %, hoặc ≤ 25 °C & ≥ 65 %. '
  '(Nguồn: Baidu Baike — 木器漆施工工艺; phiếu quy trình TW.REC-011)'),
 (28, 'Vá trám khuyết tật bằng bột trét gỗ', 'Wood Putty Spot Filling', '补土／腻子修补',
  'Trám các vết lõm, mẻ, nứt bằng bột trét gỗ cùng màu (trét hơi dư, để khô rồi chà phẳng trong bước chà nhám kế tiếp để lộ đúng hình dạng khuyết tật ban đầu). '
  'Là bước bắt buộc trong xử lý bề mặt mộc, khác với chà nhám. (Nguồn: Woodworker’s Journal — Finishing Flow Chart; phiếu TW.REC-011 ghi “trám trét những chỗ khuyết tật”; Baidu Baike — trét bột trét)'),
 (29, 'Trét lấp mắt gỗ (lỗ mạch)', 'Pore Filling / Grain Filling', '填孔（填眼）',
  'Trét bột lấp các mắt gỗ/lỗ mạch hở của loại gỗ mạch to (oak, ash, gỗ thông…) khi muốn bề mặt phẳng như kính; sau khi bột khô phải chà nhẹ lấy hết bột dư trên bề mặt. '
  'Thường phải khoá bề mặt trước bằng lớp mỏng (shellac pha loãng hoặc chính sơn phủ pha loãng) rồi mới trét. Bột gốc nước khô qua đêm, bột gốc dầu khô ~3 ngày. '
  '(Nguồn: Woodworker’s Journal — Finishing Flow Chart; Baidu Baike — “bịt kín các mắt gỗ và vết sẹo”)'),
 (30, 'Nâng thớ – khử xù lông gỗ', 'Grain Raising & De-furring (Water Popping)', '起毛与去木毛',
  'Làm ẩm bề mặt bằng khăn nước sạch (hoặc nước) cho các thớ gỗ phồng lên, để khô (qua đêm), rồi chà nhám rất nhẹ (≈ #400) chỉ đủ để cắt lông gỗ. '
  'Bắt buộc với hệ sơn nước (water-based) và với gỗ mềm để tránh hiện tượng “xù lông” sau lớp phủ đầu. (Nguồn: Woodworker’s Journal — Finishing Flow Chart; SeasonHome — Finishing Schedule)'),
 (31, 'Xử lý chống loang màu', 'Wood Conditioner / Blotch Control', '防色斑预处理（均色预处理）',
  'Phủ chất xử lý chống loang (wood conditioner) trước khi lên màu với các loại gỗ dễ loang màu (gỗ mềm, thông, vùng gỗ già/gỗ non xen kẽ); phủ rồi lau bớt và tiến hành lên màu ngay khi lớp xử lý còn ẩm. '
  'Chỉ dùng khi thực sự cần (thử trên mẫu trước). (Nguồn: Woodworker’s Journal — Finishing Flow Chart; SeasonHome — Finishing Schedule; The Carpenter’s Guide)'),
 (32, 'Khử bụi – lau tack trước khi phủ', 'Dust Removal / Tack Wipe', '除尘（粘布擦拭）',
  'Hút/thon/thổi sạch bụi chà nhám rồi lau bằng vải dính (tack cloth) để lấy hết bụi mịn trước MỖI lớp phủ. '
  'Bụi sót lại là nguyên nhân hạt bụi/nhám sần trên màng sơn. (Nguồn: Woodworker’s Journal — “clean off dust” bắt buộc; SeasonHome; Woodwork Handbook; Baidu Baike — làm sạch bề mặt)'),
 (33, 'Chà nhám giữa lớp (xử lý hạt bụi)', 'Intercoat Sanding / Denibbing', '层间打磨（去颗粒）',
  'Chà nhám nhẹ giữa các lớp (sau lớp lót và giữa các lớp phủ, khi màng đã khô) để làm phẳng hạt bụi, độ nhám bề mặt và tạo bám dính cho lớp sau; chà nhám tay theo chiều thớ gỗ khi có thể. '
  'Đây là bước lặp lại nhiều lần trong một quy trình — khác với bước 16 “Chà nhám” (xử lý mộc ban đầu). (Nguồn: Baidu Baike — “chà nhám nhiều lớp”; cũng thấy trong 3/4 mẫu BT CHEM: xả nhám #320/#400 giữa các lớp)'),
 (34, 'Đánh bóng – miết bóng hoàn thiện', 'Rubbing Out & Polishing', '抛光（擦亮）',
  'Sau khi lớp phủ cuối đóng rắn: miết/đánh bóng bề mặt bằng bột nhám mịn (pumice/rottenstone), hợp chất đánh bóng hoặc sáp để loại hạt bụi lồi, vết chảy và đưa màng về đúng độ bóng mong muốn (mờ/bán bóng/bóng gương). '
  'Yêu cầu màng sơn phải đủ cứng (đóng rắn hoàn toàn) trước khi miết. (Nguồn: Woodworker’s Journal — “Rub Out”; Woodwork Handbook — “Waxing and Polishing”; Baidu Baike — “đánh bóng bằng nước”)'),
]

ts = time.strftime('%Y%m%d_%H%M%S')
bak = os.path.join(D, '_backup_CSDLA_truoc_bo_sung_buoc_web_%s.db' % ts)
shutil.copy2(DB, bak)
print('backup:', os.path.basename(bak), os.path.getsize(bak), 'byte')

con = sqlite3.connect(DB)
c = con.cursor()
truoc = c.execute('select count(*) from buoc_chuan').fetchone()[0]
for so, vi, en, zh, df in B:
    c.execute('insert or replace into buoc_chuan (so, ten_vi, ten_en, ten_zh, dinh_nghia_vi) values (?,?,?,?,?)', (so, vi, en, zh, df))
con.commit()
sau = c.execute('select count(*) from buoc_chuan').fetchone()[0]
print('buoc_chuan: %d -> %d' % (truoc, sau))
for r in c.execute('select so, ten_vi, ten_en, ten_zh from buoc_chuan where so >= 26 order by so'):
    print('   ', r)

# bang nguon_quet: ghi nguon web da dung
print()
print('nguon_quet — them nguon web:')
cols = [d[1] for d in c.execute('pragma table_info(nguon_quet)')]
print('   cot hien co:', cols)
WEB = [
 ('https://www.woodworkersjournal.com/wp-content/uploads/finishing_flowchart.pdf', 'Woodworker’s Journal — Finishing Flow Chart (Michael Dresdner, 08/2005) — thứ tự bắt buộc/tuỳ chọn', 9),
 ('https://seasonhome.net/wood-finishing-schedule/', 'SeasonHome — Finishing Schedule: From Sand to Seal (6 bước)', 5),
 ('https://woodworkhandbook.com/wood-finishing-techniques/', 'Woodwork Handbook — Wood Finishing Techniques (11 mục, gồm đánh bóng/sáp)', 6),
 ('https://baike.baidu.com/item/%E6%9C%A8%E5%99%A8%E6%BC%86%E6%96%BD%E5%B7%A5%E5%B7%A5%E8%89%BA/3520052', 'Baidu Baike — Kỹ thuật ứng dụng sơn phủ gỗ (木器漆施工工艺): độ ẩm gỗ ≤12 %, nhiệt độ >5 ℃, ẩm ≤85 %', 5),
 ('https://thecarpentersguide.com/articles/finishing-wood-guide/', 'The Carpenter’s Guide — Finishing Wood: Stains, Sealers, Topcoats (xử lý bề mặt, chất khoá, lớp phủ)', 3),
 ('https://johnsonhobby.com/understanding-wood-finishing-schedules/', 'Johnson Hobby — Understanding Wood Finishing Schedules (chuẩn bị, chà nhám, đóng rắn)', 2),
]
try:
    for u, mo, nb in WEB:
        c.execute('insert into nguon_quet (nguon, loai, so_ban_ghi, ngay_quet, ghi_chu) values (?,?,?,?,?)',
                  (u, 'web', nb, '2026-10-05', mo))
    con.commit()
    print('   da them', len(WEB), 'nguon web | tong nguon_quet:', c.execute('select count(*) from nguon_quet').fetchone()[0])
except Exception as e:
    print('   (khong them duoc vao nguon_quet:', e, ')')
con.close()

# ---- file bo buoc chuan: 25 -> 34 ----
MD25 = os.path.join(D, '01-Bo-dinh-nghia-34-buoc.md')
MD34 = os.path.join(D, '01-Bo-dinh-nghia-34-buoc.md')
t = open(MD25, encoding='utf-8').read()
t = t.replace('BỘ ĐỊNH NGHĨA CHUẨN 25 BƯỚC QUY TRÌNH SƠN (STEP FINISH)',
              'BỘ ĐỊNH NGHĨA CHUẨN 34 BƯỚC QUY TRÌNH SƠN (STEP FINISH)')
t = t.replace('## I. BẢNG ĐỐI CHIẾU 25 BƯỚC', '## I. BẢNG ĐỐI CHIẾU 34 BƯỚC')
ROW25 = [l for l in t.split('\n') if l.startswith('| 25 |')]
assert ROW25, 'khong thay dong 25'
extra = '\n'.join('| %d | %s ***(bổ sung 05/10/2026)*** | %s | %s |' % (so, vi, en, zh) for so, vi, en, zh, _ in B)
t = t.replace(ROW25[0], ROW25[0] + '\n' + extra)
SEC = []
for so, vi, en, zh, df in B:
    SEC.append('\n---\n\n### %d. %s (%s / %s) — ***bổ sung 05/10/2026 (nguồn tài liệu quốc tế)***\n- **Định nghĩa (do dự án A biên soạn từ nguồn ngoài):** %s\n' % (so, vi, en, zh, df))
t = t.rstrip() + '\n' + '\n'.join(SEC)
open(MD34, 'w', encoding='utf-8').write(t)
print()
print('ghi %s (%d byte)' % (os.path.basename(MD34), os.path.getsize(MD34)))
thieu = [i for i in range(1, 35) if ('### %d. ' % i) not in t]
print('   muc 1-34 du:', not thieu, thieu)
print('   so dong bang:', sum(1 for l in t.split('\n') if re.match(r'^\| \d+ \|', l)))
os.remove(MD25)
print('   da xoa ban 25 buoc:', not os.path.exists(MD25))

# luu nguon web vao du an (bang chung)
src = os.path.join(os.environ['LOCALAPPDATA'], 'Temp', 'csdla', 'nguon')
dst = os.path.join(D, 'nguon_web')
os.makedirs(dst, exist_ok=True)
n = 0
for fn in os.listdir(src):
    if fn.endswith('.json'):
        shutil.copy2(os.path.join(src, fn), dst)
        n += 1
shutil.copy2(os.path.join(os.environ['LOCALAPPDATA'], 'Temp', 'csdla', 'pdf', 'flowchart.txt'), dst)
print('   luu %d file nguon -> %s' % (n + 1, dst))
