# -*- coding: utf-8 -*-
"""Chuẩn bị gói việc gửi AGY: đề xuất CÔNG THỨC MÀU NỀN (hệ Dye + Pigment) từ CSDL B.
- 2 ảnh: mẫu đã lên màu + gỗ mộc
- Số liệu ĐO BẰNG CODE (trung vị pixel, CIELAB D65) kèm cảnh báo sai lệch
- Toàn bộ danh mục CSDL B: 26 mã (mau) + 121 ô bảng in (mau_bang_in, có nồng độ % + Lab đo được + độ tin cậy)
KHÔNG tự chèn công thức: AGY phải tự đề xuất, mình kiểm chứng lại sau bằng code."""
import io, json, os, shutil, sqlite3

B = r'C:\Claw 2\Nghien cuu\Du-an-B-He-mau-Stain-Glaze'
DIR = os.path.join(B, 'phan-tich-nen-mau-07-10')
DB = os.path.join(B, 'CSDLB.db')
MAU = r'C:\Users\admin\AppData\Local\hermes\cache\images\img_d3d125fe9364.jpg'
MOC = r'C:\Users\admin\AppData\Local\hermes\cache\images\img_94ae2ffb4ecc.jpg'
os.makedirs(DIR, exist_ok=True)
shutil.copy2(MAU, os.path.join(DIR, '1_MAU_da_len_mau.jpg'))
shutil.copy2(MOC, os.path.join(DIR, '2_GO_MOC.jpg'))

# ---------- số liệu đo ----------
do = json.load(io.open(os.path.join(B, 'anh_lo09_nen_mau', '_do_mau_nen_v2_20261007.json'), encoding='utf-8'))
t = u"""SỐ LIỆU ĐO BẰNG CODE (không phải AI ước lượng) — 07/10/2026
Cách đo: lấy TRUNG VỊ pixel trong mặt nạ màu của từng ảnh, đổi sRGB → CIELAB (D65).
⚠️ Sai số: ảnh chụp KHÔNG kèm thẻ màu chuẩn nên số tuyệt đối có thể lệch vài đơn vị L*; dùng để SO SÁNH.

ẢNH 1 — MẪU ĐÃ LÊN MÀU (1_MAU_da_len_mau.jpg)
  Màu nền gỗ (trung vị):  %s   L* %.1f   a* %+.1f   b* %+.1f
  Dải sáng–tối của vân:   L* P10 %.1f → P90 %.1f  (độ sâu vân)
  Mặt nạ: pixel đỏ/nâu (a* > 6 và 20 < L* < 75); băng keo vàng nhạt bị loại.

ẢNH 2 — GỖ MỘC (2_GO_MOC.jpg)
  Màu gỗ mộc (trung vị):  %s   L* %.1f   a* %+.1f   b* %+.1f
  Dải sáng–tối:           L* P10 %.1f → P90 %.1f
  Mặt nạ: pixel trung tính (|a*| < 6, b* < 8, 45 < L* < 92); loại nền carton và thanh gỗ đậm dán mép.

CHÊNH LỆCH CẦN ĐẠT (mẫu − mộc):  ΔL* %+.1f  ·  Δa* %+.1f  ·  Δb* %+.1f
⇒ Việc của công thức: HẠ SÁNG khoảng %.1f đơn vị L*, ĐẨY ĐỎ mạnh (%+.1f a*), ĐẨY VÀNG nhẹ (%+.1f b*),
   và vẫn giữ được VÂN gỗ nhìn xuyên qua (tức là nhuộm/chất ngấm + một lớp lót màu, KHÔNG phải sơn che kín).
""" % (do['mau']['hex'], do['mau']['L'], do['mau']['a'], do['mau']['b'], do['mau']['L_p10'], do['mau']['L_p90'],
       do['moc']['hex'], do['moc']['L'], do['moc']['a'], do['moc']['b'], do['moc']['L_p10'], do['moc']['L_p90'],
       do['delta']['dL'], do['delta']['da'], do['delta']['db'],
       abs(do['delta']['dL']), do['delta']['da'], do['delta']['db'])
io.open(os.path.join(DIR, 'SO_LIEU_DO_DUOC.txt'), 'w', encoding='utf-8', newline='\r\n').write(t)

# ---------- danh mục CSDL B ----------
c = sqlite3.connect('file:%s?mode=ro' % DB.replace('\\', '/'), uri=True)
ds26 = c.execute("""SELECT nhom, ten, ma, phan_loai, hang_ncc, ton_kg, uu_tien, ci_cas, ghi_chu
                    FROM mau ORDER BY uu_tien DESC, nhom, ten""").fetchall()
L = [u'danh mục 26 mã trong CSDL B (bảng mau) — cột: nhóm | tên | mã | phân loại | hãng | tồn (kg) | ưu tiên | C.I./CAS | ghi chú']
for r in ds26:
    L.append(' | '.join('' if v is None else str(v).replace('\n', ' ') for v in r))
io.open(os.path.join(DIR, 'CSDLB_danh_muc_26ma.txt'), 'w', encoding='utf-8', newline='\r\n').write('\r\n'.join(L) + '\r\n')

ds121 = c.execute("""SELECT nhom, ma_mau, nong_do, hex, L_star, a_star, b_star, do_tin_cay, ghi_chu
                     FROM mau_bang_in ORDER BY nhom, nong_do, ma_mau""").fetchall()
L2 = [u'121 ô BẢNG MÀU IN (bảng mau_bang_in) — số màu do CODE đo pixel từ ảnh chụp bảng in;'
      u' cột: nhóm | tên in NGUYÊN VĂN (kèm %) | nồng độ % | hex | L* | a* | b* | độ tin cậy | ghi chú']
for r in ds121:
    L2.append(' | '.join('' if v is None else str(v).replace('\n', ' ') for v in r))
io.open(os.path.join(DIR, 'CSDLB_bang_mau_in_121o.txt'), 'w', encoding='utf-8', newline='\r\n').write('\r\n'.join(L2) + '\r\n')
print('đã tạo:', len(ds26), 'mã danh mục ·', len(ds121), 'ô bảng in')
print('thư mục:', DIR)
for f in sorted(os.listdir(DIR)):
    print('   ', f, os.path.getsize(os.path.join(DIR, f)), 'byte')
