# -*- coding: utf-8 -*-
"""Nạp dữ liệu hệ màu METAL COMPLEX (08/10/2026) vào CSDL B (đã xoá trắng).

Ghi: 8 mã màu vào bảng `mau` + 27 tấm mẫu vào bảng `mau_bang_in`.
KHÔNG ghi phần "Ghi chú kỹ thuật" (PHẦN D) vào CSDL B — theo yêu cầu chủ nhân.
"""
import os, re, sqlite3, unicodedata, sys

GOC = r'C:\Claw 2\Nghien cuu\Du-an-B-He-mau-Stain-Glaze'
DB = os.path.join(GOC, 'CSDLB.db')
MD = os.path.join(GOC, 'metal-complex-08-10', 'KET_QUA_METAL_COMPLEX.md')
PDF = 'He_mau_metal_complex_bang_thu_mau_va_hinh_anh_mau_UPDATE_08_10_2026.pdf'
NHOM = 'Metal Complex 08/10/2026'
NGAY = '2026-10-08'
NGUON = 'PDF hệ màu METAL COMPLEX do chủ nhân gửi 08/10/2026; AGY (gemini-3.1-pro-high) đọc ảnh'


def khong_dau(s):
    s = (s or '').replace('Đ', 'D').replace('đ', 'd')
    return unicodedata.normalize('NFD', s).encode('ascii', 'ignore').decode().strip()


def so(x):
    x = (x or '').strip().replace(',', '.')
    m = re.match(r'^-?\d+(\.\d+)?$', x)
    return float(x) if m else None


lines = open(MD, encoding='utf-8').read().split('\n')


def bang(tu_khoa, so_cot):
    i = next(k for k, l in enumerate(lines) if tu_khoa in l)
    rows = []
    for l in lines[i + 1:]:
        if l.startswith('##'):
            break
        if l.count('|') >= so_cot - 1 and not re.match(r'^\|\s*:?-{2,}', l):
            o = [x.strip() for x in l.strip().strip('|').split('|')]
            if len(o) >= so_cot and o[0] and not o[0].startswith('|'):
                rows.append(o)
    return rows


A = [r for r in bang('PHẦN A — BẢNG TỔNG HỢP MÀU', 5) if r[0].strip().upper() not in ('STT',)]
C = [r for r in bang('PHẦN C — ĐỌC MÀU TỪ ẢNH MẪU', 12) if r[0].strip().lower() != 'trang']
print('phân tích: bảng A = %d dòng | bảng C = %d dòng' % (len(A), len(C)))
assert len(C) == 27, 'bảng C phải có 27 tấm, đang có %d' % len(C)

# nhận xét + tỉ lệ pha theo tên màu (từ bảng A)
nhan_xet, ti_le, nong_do_a = {}, {}, {}
for r in A:
    ten, tl, nd, nx = r[1], r[2], r[3], r[4]
    nhan_xet[khong_dau(ten)] = nx
    ti_le[khong_dau(ten)] = tl
    nong_do_a[khong_dau(ten)] = nd
print('bảng A có %d tên màu' % len(nhan_xet))

con = sqlite3.connect(DB)
c = con.cursor()
c.executescript('DELETE FROM mau; DELETE FROM mau_bang_in;')

# ---------- 1. Bảng mau: 8 mã (bỏ dòng "Đối chứng" vì không phải mã màu) ----------
id_mau = {}
n_mau = 0
for r in A:
    ten = r[1].strip()
    if khong_dau(ten).lower().startswith('doi chung'):
        continue
    ma = re.sub(r'\s*\(.*?\)\s*', ' ', ten).strip()
    ma = re.sub(r'^(Yellow|Red|Orange|Black|Blue)\s+', '', ma).strip()
    c.execute('''INSERT INTO mau (nhom,ten,ma,phan_loai,hang_ncc,ghi_chu,nguon,ngay_cap_nhat,danh_gia,uu_tien,tai_lieu,nhom_muc)
                 VALUES (?,?,?,?,?,?,?,?,?,?,?,?)''',
              (NHOM, ten, ma, 'Dye phức kim loại (metal complex)', 'không ghi trong tài liệu',
               'Tỉ lệ pha màu:dung môi = %s · %% bột màu ở 1/10/20%% = %s' % (r[2], r[3]),
               NGUON, NGAY, r[4], None, PDF, 'Màu'))
    id_mau[khong_dau(ten)] = c.lastrowid
    n_mau += 1
print('đã thêm %d mã màu vào bảng mau' % n_mau)

# ---------- 2. Bảng mau_bang_in: 27 tấm ----------
thu_tu_anh = ['t1_o01.png', 't1_o02.png', 't1_o03.png', 't2_o01.png', 't2_o02.png', 't2_o03.png',
              't2_o04.png', 't2_o05.png', 't2_o06.png', 't2_o07.png', 't2_o08.png', 't2_o09.png',
              't3_o01.png', 't3_o02.png', 't3_o03.png', 't3_o04.png', 't3_o05.png', 't3_o06.png',
              't4_o01.png', 't4_o02.png', 't4_o03.png', 't4_o04.png', 't4_o05.png', 't4_o06.png',
              't4_o07.png', 't4_o08.png', 't4_o09.png']
n_o = 0
for i, r in enumerate(C):
    trang, ten, muc, hx, R, G, B, Ls, as_, bs, mo_ta, tin_cay = (r[0], r[1], r[2], r[3], r[4], r[5], r[6], r[7], r[8], r[9], r[10], r[11])
    kd = khong_dau(ten)
    f_anh = thu_tu_anh[i] if i < len(thu_tu_anh) else ''
    nhan_goc = ('Nhựa Base + %s màu' % muc) if muc not in ('đối chứng',) else 'Đối chứng – nền giấy trắng/đen (không kéo màu)'
    c.execute('''INSERT INTO mau_bang_in (nhom,ma_mau,ma_khong_pc,nong_do,hex,r_srgb,g_srgb,b_srgb,
                 L_star,a_star,b_star,hex_agy,dE_hai_nguon,do_tin_cay,file_anh,o,nhan_goc,tong_mau,
                 do_duoc,cach_gan,mau_id,nguon_url,ngay_tai,ghi_chu)
                 VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)''',
              (NHOM, ten, kd, muc, hx.lower(), int(R), int(G), int(B),
               so(Ls), so(as_), so(bs), hx.lower(), 0.0,
               'cao (%s – AGY đọc từ ảnh)' % tin_cay, 'anh_o/' + f_anh, f_anh, nhan_goc,
               '1 màu × 3 mức nồng độ', 'AGY đọc trung bình vùng màu thực của màng mẫu',
               'ảnh render 300 DPI + ảnh gốc tách từ PDF', id_mau.get(kd), PDF, NGAY, mo_ta))
    n_o += 1
print('đã thêm %d tấm mẫu vào bảng mau_bang_in' % n_o)

c.execute("INSERT INTO nhat_ky (ngay,viec,chi_tiet,nguon) VALUES (?,?,?,?)",
          (NGAY, 'Nạp hệ màu METAL COMPLEX vào CSDL B',
           'Nguồn: %s — 8 mã màu (bảng mau) + 27 tấm mẫu 3 mức nồng độ (mau_bang_in). Không ghi phần ghi chú kỹ thuật theo yêu cầu chủ nhân.' % PDF,
           'AGY gemini-3.1-pro-high đọc ảnh (227 s); đối chiếu khớp với script đo pixel color_results.txt'))
con.commit()
con.execute('VACUUM')

# ---------- 3. Kiểm chứng ----------
print('\n=== KIỂM CHỨNG CSDL B ===')
for (t,) in c.execute("SELECT name FROM sqlite_master WHERE type='table' AND name NOT LIKE 'sqlite_%' ORDER BY name").fetchall():
    print('   %-16s %5d dòng' % (t, c.execute('SELECT COUNT(*) FROM [%s]' % t).fetchone()[0]))
print('   integrity:', c.execute('PRAGMA integrity_check').fetchone()[0])
print('\n--- 8 mã màu ---')
for r in c.execute('SELECT ten,ma,ghi_chu FROM mau ORDER BY id'):
    print('   · %-22s | %-10s | %s' % (r[0][:22], r[1][:10], r[2][:80]))
print('\n--- 27 tấm: màu | mức | hex | L*a*b* | ảnh ---')
for r in c.execute('SELECT ma_mau,nong_do,hex,L_star,a_star,b_star,file_anh FROM mau_bang_in ORDER BY id'):
    print('   · %-20s %-6s %-8s L%6.2f a%6.2f b%6.2f  %s' % (r[0][:20], r[1], r[2], r[3], r[4], r[5], r[6]))
kq = open(os.path.join(GOC, 'metal-complex-08-10', 'color_results.txt'), encoding='utf-8').read()
loi = [r[0] for r in c.execute('SELECT hex FROM mau_bang_in ORDER BY id') if r[0] not in kq.lower()]
print('\n   đối chiếu hex với color_results.txt: %s' % ('khớp hết' if not loi else 'LỆCH: %s' % loi))
print('   có lọt ghi chú kỹ thuật vào DB không:',
      any('hàm lượng hoạt chất' in (x[0] or '') or 'tương hợp kém với nhựa BA123 (gây gel, hạt)' in (x[0] or '')
          for x in c.execute('SELECT ghi_chu FROM mau_bang_in').fetchall()))
con.close()
print('   cỡ tệp CSDLB.db:', os.path.getsize(DB), 'byte')
