# -*- coding: utf-8 -*-
"""Nạp LẠI 3 dòng ĐỐI CHỨNG của CSDL B theo yêu cầu chủ nhân 08/10/2026 (việc 2).
   - 3 ô đối chứng trong bảng màu là CÙNG MỘT ẢNH in lặp 3 lần (md5 trùng) — có CẢ nền trắng và mảng đen.
   - Trắng: pixel đo #edf2f7 (L* 95,26) · AGY đọc #f1f3f8 (L* 95)  ⇒ khớp
   - Đen:   pixel đo #0a0f13 (L* 4,09)  · AGY đọc #101114 (L* 4)   ⇒ khớp
"""
import math, os, shutil, sqlite3, time

GOC = r'C:\Claw 2\Nghien cuu\Du-an-B-He-mau-Stain-Glaze'
DB = os.path.join(GOC, 'CSDLB.db')
BAK = os.path.join(GOC, '_backup', 'CSDLB_bak_%s_truoc_doc_lai_doi_chung.db' % time.strftime('%Y%m%d_%H%M'))
shutil.copy2(DB, BAK)
print('backup:', BAK, os.path.getsize(BAK), 'B')


def lab(hexs):
    r, g, b = int(hexs[1:3], 16) / 255, int(hexs[3:5], 16) / 255, int(hexs[5:7], 16) / 255
    def f(c): return c / 12.92 if c <= 0.04045 else ((c + 0.055) / 1.055) ** 2.4
    R, G, B = f(r), f(g), f(b)
    X = R * 0.4124 + G * 0.3576 + B * 0.1805
    Y = R * 0.2126 + G * 0.7152 + B * 0.0722
    Z = R * 0.0193 + G * 0.1192 + B * 0.9505
    def g2(t): return t ** (1 / 3) if t > 0.008856 else 7.787 * t + 16 / 116
    fx, fy, fz = g2(X / 0.95047), g2(Y / 1.0), g2(Z / 1.08883)
    return 116 * fy - 16, 500 * (fx - fy), 200 * (fy - fz)


def dE(h1, h2):
    a, b, c = lab(h1)
    x, y, z = lab(h2)
    return round(math.sqrt((a - x) ** 2 + (b - y) ** 2 + (c - z) ** 2), 2)


# (id, nhãn, hex đo, hex AGY đọc, mô tả)
DONG = [
    (52, 'Đối chứng – nền giấy TRẮNG (không kéo màu)', '#edf2f7', '#f1f3f8',
     'Vùng giấy trắng ở 40–100% chiều cao ảnh. Tài liệu ghi (nguyên văn): “Khối Đối chứng: nền giấy trắng/đen tự nhiên, không kéo màu — dùng làm chuẩn so màu.” Nạp lại 08/10/2026: số đo pixel #edf2f7 · agy đọc #f1f3f8 (khớp).'),
    (53, 'Đối chứng – nền ĐEN (mảng đen phía trên)', '#0a0f13', '#101114',
     'Mảng ĐEN in ở ~0–25% chiều cao ảnh (vùng đen sạch 0–10% có chữ in lộn ngược “Formular/Batch no…”). Dùng làm CHUẨN TỐI — trước đây bị đọc nhầm thành trắng. Nạp lại 08/10/2026: pixel #0a0f13 · agy #101114 (khớp).'),
    (54, 'Đối chứng – ẢNH LẶP LẠI của cùng tấm (tài liệu in 3 lần)', '#edf2f7', '#f1f3f8',
     'Ảnh trùng md5 d326e0ee6a48f3d8f687b87ae9dccc4a với 2 ô đối chứng còn lại ⇒ tài liệu in LẶP cùng một tấm 3 lần (không phải 3 tấm khác nhau). Giữ giá trị nền trắng để tham chiếu.'),
]

con = sqlite3.connect(DB)
c = con.cursor()
print('\n=== TRƯỚC ===')
for r in c.execute('SELECT id,hex,L_star,a_star,b_star,hex_agy,dE_hai_nguon,nhan_goc FROM mau_bang_in WHERE id IN (52,53,54) ORDER BY id'):
    print('  ', r)

for i, nhan, hexdo, hexagy, mota in DONG:
    r, g, b = int(hexdo[1:3], 16), int(hexdo[3:5], 16), int(hexdo[5:7], 16)
    L, A, B = lab(hexdo)
    c.execute('''UPDATE mau_bang_in SET hex=?, r_srgb=?, g_srgb=?, b_srgb=?, L_star=?, a_star=?, b_star=?,
                 hex_agy=?, dE_hai_nguon=?, do_tin_cay=?, nhan_goc=?, ghi_chu=?, cach_gan=? WHERE id=?''',
              (hexdo, r, g, b, round(L, 2), round(A, 2), round(B, 2), hexagy, dE(hexdo, hexagy),
               'cao (95% – agy đọc vùng đều màu + pixel đo khớp)', nhan, mota,
               'đọc lại 08/10/2026 (pixel đo ảnh gốc tách từ PDF + agy gemini-3.1-pro-high đọc mắt)', i))

c.execute("INSERT INTO nhat_ky (ngay,viec,chi_tiet,nguon) VALUES (?,?,?,?)",
          (time.strftime('%Y-%m-%d %H:%M'), 'Đọc LẠI 3 dòng đối chứng của bảng màu Metal Complex',
           'Phát hiện 3 ô đối chứng là CÙNG MỘT ẢNH in lặp 3 lần (md5 d326e0ee…), trong tấm có cả nền giấy TRẮNG '
           '(L*≈95,3 · #edf2f7) và mảng ĐEN (L*≈4,1 · #0a0f13) — trước đây cả 3 dòng đều ghi giá trị trắng #edf0f7. '
           'Nay: id 52 = nền trắng · id 53 = mảng đen (chuẩn tối) · id 54 = ảnh lặp lại (ghi rõ trùng md5). '
           'Hai nguồn khớp nhau (pixel đo ảnh PDF ⇄ agy gemini-3.1-pro-high đọc mắt). Backup: %s' % os.path.basename(BAK),
           'chủ nhân yêu cầu 08/10/2026'))
con.commit()

print('\n=== SAU ===')
for r in c.execute('SELECT id,hex,L_star,a_star,b_star,hex_agy,dE_hai_nguon,nhan_goc FROM mau_bang_in WHERE id IN (52,53,54) ORDER BY id'):
    print('  id %s | hex %s | L* %s a* %s b* %s | agy %s | ΔE %s\n     %s' % r)
print('\n  tổng tấm kéo màu:', c.execute('SELECT COUNT(*) FROM mau_bang_in').fetchone()[0])
print('  integrity:', c.execute('PRAGMA integrity_check').fetchone()[0])
con.close()
