# -*- coding: utf-8 -*-
"""Theo lệnh chủ dự án 06/10/2026:
  (1) CHUYỂN 25 mã danh mục màu (nguồn Danh_muc_mau_dung_nhieu_cho_Glaze_va_Duro_Stain_04-10-2026.docx) sang CSDL B
      — TRỪ 4 mã mẫu màu lấy từ ảnh phiếu (giữ lại ở A).
  (2) XOÁ 4 dòng rác (CAS 1309, CAS 1333, CAS 1317, D50) khỏi A (và không đưa sang B).
  (3) GỠ TÊN KTV ở 2 dòng phiếu mẫu (id 27, 29) trong A.
Kết quả mong đợi: A.danh_muc_mau còn ĐÚNG 4 dòng (TW.REC-011, PT-06 10/26, PT-011 H, PT-002 H) — sạch tên riêng.
"""
import os, shutil, sqlite3, time

NGAY = '2026-10-06'
A = r'C:\Claw 2\Nghien cuu\Du-an-A-Quy-trinh-son\CSDLA.db'
B = r'C:\Claw 2\Nghien cuu\Du-an-B-He-mau-Stain-Glaze\CSDLB.db'

# ---------- BACKUP A ----------
ts = time.strftime('%Y%m%d_%H%M%S')
bak = os.path.join(os.path.dirname(A), '_backup_CSDLA_truoc_chuyen_danhmuc_mau_%s.db' % ts)
shutil.copy2(A, bak)
print('backup A:', os.path.basename(bak), os.path.getsize(bak), 'byte')

ca = sqlite3.connect(A)
ca.row_factory = sqlite3.Row
rows = list(ca.execute('select * from danh_muc_mau order by id'))
print('A — danh_muc_mau trước:', len(rows), 'dòng')

RAC = {'CAS 1309', 'CAS 1333', 'CAS 1317', 'D50'}
GIU_LAI = {'TW.REC-011', 'PT-06 10/26', 'PT-011 H', 'PT-002 H'}          # 4 mã mẫu màu từ ảnh phiếu — KHÔNG chuyển
chuyen = [r for r in rows if r['ma_mau'] not in RAC and r['ma_mau'] not in GIU_LAI]
xoa_rac = [r for r in rows if r['ma_mau'] in RAC]
print('A — chuyển sang B: %d | xoá rác: %d | giữ lại: %d' % (len(chuyen), len(xoa_rac), len(rows) - len(chuyen) - len(xoa_rac)))
print('   xoá rác:', [r['ma_mau'] for r in xoa_rac])

# ---------- GHI SANG B (bảng phụ lưu vết chuyển) ----------
cb = sqlite3.connect(B)
cols = [r[1] for r in cb.execute('pragma table_info(mau)')]
for c, t in [('ci_cas', 'text'), ('ton_kg', 'real'), ('ben_sang', 'text'), ('ben_thoi_tiet', 'text'),
             ('danh_gia', 'text'), ('uu_tien', 'integer'), ('tai_lieu', 'text'), ('nhom_muc', 'text')]:
    if c not in cols:
        cb.execute('alter table mau add column %s %s' % (c, t))
print('\nB — đã bổ sung cột:', [c for c in ['ci_cas', 'ton_kg', 'ben_sang', 'ben_thoi_tiet', 'danh_gia', 'uu_tien', 'tai_lieu', 'nhom_muc'] if c not in cols])

# ---- thông tin mục 2 của tài liệu (10 mã ưu tiên) ----
UU_TIEN = {
    'Umber Pigment 645': dict(ci_cas='P.Br.7; CAS 12713-03-0', ton_kg=950, ben_sang='7–8', ben_thoi_tiet='5',
        danh_gia='Màu nâu đất CHỦ LỰC cho glaze và Duro Stain; hợp tone walnut/teak/antique',
        uu_tien=1, tai_lieu='ĐÃ CÓ: TDS Umber 645 + SDS Umber/Sienna 645. Thiếu: COA theo lô', nhom_muc='Mục 2 – ưu tiên'),
    'Hoover 778 BN': dict(ci_cas='Mixture – blended iron oxide', ton_kg=1150, ben_sang='NCC: lightfast', ben_thoi_tiet='chưa ghi',
        danh_gia='Ưu tiên cao cho stain nâu đậm/Van Dyke; cần xác nhận độ trong, bền dung môi, tương thích binder',
        uu_tien=2, tai_lieu='ĐÃ CÓ: tài liệu Hoover 778BN (thư mục TDS). Thiếu: SDS riêng theo mã 778 BN', nhom_muc='Mục 2 – ưu tiên'),
    'Ferrispec FP YB-2087': dict(ci_cas='P.Y.42; CAS 51274', ton_kg=800, ben_sang='7–8', ben_thoi_tiet='5',
        danh_gia='Ưu tiên cho glaze vàng mật ong, oak, teak; kiểm tra tone & độ trong trên nền gỗ',
        uu_tien=3, tai_lieu='ĐÃ CÓ: SDS Ferrispec YB2087 (VN). Thiếu: TDS riêng YB-2087', nhom_muc='Mục 2 – ưu tiên'),
    'Iron Oxide RB 4097': dict(ci_cas='P.R.101; CAS 1309-37-1', ton_kg=200, ben_sang='7–8', ben_thoi_tiet='5',
        danh_gia='Rất phù hợp glaze và Duro Stain; màu trong/đỏ gỗ cần kiểm độ trong & strength',
        uu_tien=4, tai_lieu='ĐÃ CÓ: TDS KROMA RED IRON OXIDE RO (US, dải 2097–7097) + SDS KROMA VN (4097, 4597) + SDS FERRISPEC RB 4097. Thiếu: COA theo lô', nhom_muc='Mục 2 – ưu tiên'),
    'Red RO 4597': dict(ci_cas='P.R.101; CAS 1309-37-1', ton_kg=75, ben_sang='7–8', ben_thoi_tiet='5',
        danh_gia='Cùng nhóm đỏ oxit — kiểm độ trong & strength', uu_tien=4,
        tai_lieu='ĐÃ CÓ: SDS KROMA VN (4097, 4597). Thiếu: COA theo lô', nhom_muc='Mục 2 – ưu tiên'),
    'Ferrispec FP RB-4097': dict(ci_cas='P.R.101; CAS 1309-37-1', ton_kg=375, ben_sang='7–8', ben_thoi_tiet='5',
        danh_gia='Cùng nhóm đỏ oxit Ferrispec (xem thêm Iron Oxide RB 4097)', uu_tien=4,
        tai_lieu='ĐÃ CÓ: SDS FERRISPEC RB 4097 (VN)', nhom_muc='Mục 2 – ưu tiên'),
    'Pigment Brown TB 1008': dict(ci_cas='chưa công bố đầy đủ', ton_kg=1047.5, ben_sang='chưa có', ben_thoi_tiet='chưa có',
        danh_gia='Tồn lớn — dùng thử glaze/Duro Stain; BẮT BUỘC lấy TDS/SDS + pigment index + vehicle trước khi chốt',
        uu_tien=5, tai_lieu='ĐÃ CÓ: SDS Pigment Brown TB-1008 (Genky). Thiếu: TDS TB 1008', nhom_muc='Mục 2 – ưu tiên'),
    'Brown SP 1008 W': dict(ci_cas='chưa công bố đầy đủ', ton_kg=323.9, ben_sang='chưa có', ben_thoi_tiet='chưa có',
        danh_gia='Tồn lớn — dùng thử glaze/Duro Stain; cần toàn bộ tài liệu', uu_tien=5,
        tai_lieu='THIẾU toàn bộ tài liệu cho Brown SP 1008 W', nhom_muc='Mục 2 – ưu tiên'),
    'Carbon Black MA 100': dict(ci_cas='P.Bk.7; CAS 1333-86-4', ton_kg=430, ben_sang='8', ben_thoi_tiet='5',
        danh_gia='Chỉnh tone, tạo walnut/ebony; dùng THẤP để tránh làm đục glaze', uu_tien=6,
        tai_lieu='ĐÃ CÓ: MSDS Mitsubishi Carbon Black MA 100 + SDS NL.000329 MA 100 (CLP VN). Thiếu: COA', nhom_muc='Mục 2 – ưu tiên'),
    'Carbon 30L': dict(ci_cas='P.Bk.7 (nghi mã HIBLACK 30L)', ton_kg=850, ben_sang='8', ben_thoi_tiet='5',
        danh_gia='Chỉnh tone; dùng thấp', uu_tien=6,
        tai_lieu='MSDS HIBLACK 30L (Tín Phú) — CẦN XÁC NHẬN có đúng là Carbon 30L không; thiếu TDS', nhom_muc='Mục 2 – ưu tiên'),
    'Iron oxide Black VAP-330M': dict(ci_cas='P.Bk.11; CAS 1317-61-9', ton_kg=425, ben_sang='8', ben_thoi_tiet='5',
        danh_gia='Đen nâu & tone trầm; hệ cần độ bền cao, kiểm độ trong trên veneer', nhom_muc='Mục 2 – ưu tiên',
        tai_lieu='ĐÃ CÓ: MSDS IRON OXIDE Black VAP-330M (Diễn bổ sung 02/10). Thiếu: TDS'),
    'Hififast Yellow HF4G': dict(ci_cas='P.Y.151; C.I. 13980', ton_kg=190, ben_sang='NCC: rất tốt', ben_thoi_tiet='NCC: tốt',
        danh_gia='Phối vàng glaze/stain khi cần màu sạch; kiểm bleeding, solvent fastness, độ trong', nhom_muc='Mục 2 – ưu tiên',
        tai_lieu='ĐÃ CÓ đủ: TDS + MSDS HIFIFAST Yellow HF4G (EN) (+ SDS Hostaperm H4G-CN bản Việt — mã khác). Thiếu: COA'),
    'Pigment Red TR 718': dict(ci_cas='P.R.101 transparent oxide', ton_kg=298.5, ben_sang='7–8', ben_thoi_tiet='5',
        danh_gia='Ưu tiên cho đỏ trong trên gỗ; xác nhận TDS Genky + tương thích hệ Duro',
        tai_lieu='ĐÃ CÓ: MSDS VN TR-718 (VAPAC). Thiếu: TDS + COA', nhom_muc='Mục 2 – ưu tiên'),
}

# ---- 15 mã mục 8 (màu khác vừa có tài liệu) ----
MUC8 = [
    ('C5', 'Blue C5 (Chromaflo - 8727225)', 'Chromaflo (màu pha máy)', 'SDS bản Việt/EN + TDS Blue C5', 'Màu pha máy, CHƯA vào 10 mã ưu tiên'),
    ('C6', 'Blue C6 (Chromaflo - 8727027)', 'Chromaflo (màu pha máy)', 'SDS bản Việt/EN', 'Màu pha máy, chưa vào ưu tiên'),
    ('C4', 'Red C4 (Chromaflo - 8720801)', 'Chromaflo (màu pha máy)', 'MSDS VN + TDS Red C4', 'Màu pha máy, chưa vào ưu tiên'),
    ('C2', 'Yellow C2 (Chromaflo - 8722040)', 'Chromaflo (màu pha máy)', 'TDS (8722040 YELLOW C2)', 'Màu pha máy, chưa vào ưu tiên'),
    ('C26', 'Yellow Oxide C26 (Chromaflo - 8721826)', 'Chromaflo (màu pha máy)', 'TDS (8721826 YELLOW OXIDE C26)', 'Màu pha máy, chưa vào ưu tiên'),
    ('C27', 'Red Oxide C27 (Chromaflo - 8721027)', 'Chromaflo (màu pha máy)', 'MSDS VN (34. Chromaflo 8721027) + TDS Red Oxide C27', 'Màu pha máy, chưa vào ưu tiên'),
    ('BLACK 20', 'MH Black 20 (NL.001471)', 'Màu nội bộ MH', 'TDS + MSDS (kèm công thức pha trong bảng tính 02/10)', 'Solvent Black 27'),
    ('BLACK 56', 'MH Black 56 (NL.001475)', 'Màu nội bộ MH', 'TDS + MSDS', 'Solvent Black 28'),
    ('Y82', 'MH Yellow 57 (Y82)', 'Màu nội bộ MH', 'TDS (2024) — thiếu MSDS', '—'),
    ('CN09', 'Novoperm Red F3RK 70-CN09', 'Clariant', 'MSDS bản Việt (Novoperm Red F3RK 70-CN09)', '—'),
    ('BG 100', 'Hostatint Blue A-BG 100', 'Hostatint (BASF/Clariant)', 'MSDS', '—'),
    ('G007', 'Paste màu xanh lá TS-G007 (Tri Mộc)', 'Tri Mộc', 'MSDS', '—'),
    ('NS 29', 'UC General Red NS 29', 'Matapel / Eckart', 'MSDS bản Việt', '—'),
    ('NS 40', 'UC Giant Blue NS 40', 'Matapel / Eckart', 'MSDS bản Việt + SDS 02/10', '—'),
    ('VAP-330M', 'Iron oxide Black VAP-330M', 'MATAPEL - ECKART', 'MSDS 02/10', 'đã có trong danh mục oxid'),
]

n_new = n_upd = 0
for r in chuyen:
    ma = r['ma_mau']
    # tìm dòng tương ứng trong B theo mã
    hit = cb.execute("select id, ten from mau where ma = ? or ma = ? or ten like ? or ten like ?",
                     (ma, ma.replace(' ', ''), '%' + ma + '%', '%' + ma.replace(' ', '') + '%')).fetchone()
    info = {}
    for k, v in UU_TIEN.items():
        if k.lower() == ma.lower() or ma.lower() in k.lower() or k.lower() in (hit[1].lower() if hit else ''):
            info = v
            break
    if hit:
        sets = {k: v for k, v in info.items() if v is not None}
        sets['ghi_chu'] = ((hit and 'Đã chuyển từ CSDL A (nguồn: Danh mục màu ưu tiên Glaze/Duro Stain 04-10-2026)')) 
        if sets:
            cb.execute('update mau set %s where id = ?' % ','.join('%s=?' % k for k in sets),
                       list(sets.values()) + [hit[0]])
            n_upd += 1
    else:
        cb.execute("""insert into mau (nhom, ten, ma, phan_loai, hang_ncc, ghi_chu, nguon, ngay_cap_nhat,
                                        ci_cas, ton_kg, ben_sang, ben_thoi_tiet, danh_gia, uu_tien, tai_lieu, nhom_muc)
                      values (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)""",
                   ('(mục 8 – chưa xếp nhóm)', ma, ma, 'chưa phân loại oxit/hữu cơ', None,
                    'Chuyển từ CSDL A — nguồn: Danh mục màu ưu tiên Glaze/Duro Stain 04-10-2026 (mục 8)',
                    'Chuyển từ A theo lệnh chủ dự án 06/10/2026', NGAY,
                    info.get('ci_cas'), info.get('ton_kg'), info.get('ben_sang'), info.get('ben_thoi_tiet'),
                    info.get('danh_gia'), info.get('uu_tien'), info.get('tai_lieu'), info.get('nhom_muc') or 'Mục 8 – có tài liệu'))
        n_new += 1

# bổ sung 15 mã mục 8 (nếu chưa có) + Carbon 30L
for ma, ten, hang, tailieu, gc in MUC8:
    if cb.execute("select count(*) from mau where ma = ? or ten like ?", (ma, '%' + ma + '%')).fetchone()[0]:
        continue
    cb.execute("""insert into mau (nhom, ten, ma, phan_loai, hang_ncc, ghi_chu, nguon, ngay_cap_nhat, tai_lieu, nhom_muc)
                  values (?,?,?,?,?,?,?,?,?,?)""",
               ('(mục 8 – chưa xếp nhóm)', ten, ma, 'chưa phân loại oxit/hữu cơ', hang, gc,
                'Danh mục màu ưu tiên Glaze/Duro Stain 04-10-2026 (mục 8)', NGAY, tailieu, 'Mục 8 – có tài liệu'))
    n_new += 1
if not cb.execute("select count(*) from mau where ma = '30L'").fetchone()[0]:
    d = UU_TIEN['Carbon 30L']
    cb.execute("""insert into mau (nhom, ten, ma, phan_loai, ghi_chu, nguon, ngay_cap_nhat, ci_cas, ton_kg, ben_sang,
                  ben_thoi_tiet, danh_gia, uu_tien, tai_lieu, nhom_muc) values (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)""",
               ('ĐEN', 'Carbon 30L', '30L', 'Carbon black', 'Mã ưu tiên trong tài liệu 04/10 (nghi là HIBLACK 30L)',
                'Danh mục màu ưu tiên Glaze/Duro Stain 04-10-2026', NGAY, d['ci_cas'], d['ton_kg'], d['ben_sang'],
                d['ben_thoi_tiet'], d['danh_gia'], d['uu_tien'], d['tai_lieu'], d['nhom_muc']))
    n_new += 1

# ghi nguồn tài liệu
cb.execute("""insert into nhat_ky (ngay, viec, chi_tiet, nguon) values (?,?,?,?)""",
           (NGAY, 'Chuyển danh mục màu từ CSDL A sang B',
            'Chuyển %d mã (nguồn Danh_muc_mau_dung_nhieu_cho_Glaze_va_Duro_Stain_04-10-2026.docx) sang B; thêm %d mã mới, cập nhật %d mã đã có. KÈM thông tin C.I./CAS, tồn kho, bền sáng/thời tiết, đánh giá, thứ tự ưu tiên, trạng thái tài liệu (TDS/SDS/COA). Thư viện tài liệu: C:\\Claw 2\\Nghien cuu\\04-Mau-sac-Dye-Pigment\\MSDS-TDS_OneDrive_02-10-26 (61 tài liệu) + Check list tồn kho NL màu 02-10-26.xlsx.' % (len(chuyen), n_new, n_upd),
            'Lệnh chủ dự án 06/10/2026 (trừ 4 mã mẫu màu từ ảnh phiếu — giữ ở A)'))
cb.commit()
print('B — thêm mới %d mã · cập nhật %d mã' % (n_new, n_upd))

# ---------- XOÁ Ở A + GỠ TÊN KTV ----------
n_chuyen = ca.execute("delete from danh_muc_mau where ma_mau in (%s)" % ','.join('?' * len(chuyen)), [r['ma_mau'] for r in chuyen]).rowcount
n_rac = ca.execute("delete from danh_muc_mau where ma_mau in ('CAS 1309','CAS 1333','CAS 1317','D50')").rowcount
ca.execute("update danh_muc_mau set ghi_chu = replace(replace(ghi_chu,'Nguyễn Văn Tươi','KTV (ẩn danh)'),'NV N.D. Vững','KTV (ẩn danh)') where id in (27,29)")
ca.commit()
con = list(ca.execute('select id, ma_mau, khach_hang, ghi_chu from danh_muc_mau order by id'))
print('\nA — đã chuyển %d · đã xoá rác %d ⇒ CÒN %d dòng:' % (n_chuyen, n_rac, len(con)))
for r in con:
    print('   id %-3s | %-14s | %-22s | %s' % (r[0], r[1], (r[2] or '—'), (r[3] or '')[:80]))
print('A — integrity:', ca.execute('pragma integrity_check').fetchone()[0], '| danh_muc_mau', len(con), '| huan_luyen', ca.execute('select count(*) from huan_luyen').fetchone()[0])
ca.close()

print()
print('B — tổng mã màu:', cb.execute('select count(*) from mau').fetchone()[0],
      '| có thông tin C.I./CAS:', cb.execute('select count(*) from mau where ci_cas is not null').fetchone()[0],
      '| có tồn kho:', cb.execute('select count(*) from mau where ton_kg is not null').fetchone()[0],
      '| có thứ tự ưu tiên:', cb.execute('select count(*) from mau where uu_tien is not null').fetchone()[0])
print('B — integrity:', cb.execute('pragma integrity_check').fetchone()[0])
cb.close()
