# -*- coding: utf-8 -*-
"""Bước 1 cho việc lô mới: (a) màu DYE/PIGMENT trong CSDL B; (b) quy trình chuẩn trong CSDL A; (c) đo lại màu 2 ảnh bằng code."""
import sqlite3, io, os, json
import numpy as np
from PIL import Image

B = r'C:\Claw 2\Nghien cuu\Du-an-B-He-mau-Stain-Glaze\CSDLB.db'
A = r'C:\Claw 2\Nghien cuu\Du-an-A-Quy-trinh-son\CSDLA.db'
IMG = os.path.expandvars(r'%LOCALAPPDATA%\hermes\cache\images')
OUT = r'C:\Claw 2\Nghien cuu\Du-an-A-Quy-trinh-son\lo10-0710'
os.makedirs(OUT, exist_ok=True)

b = sqlite3.connect('file:%s?mode=ro' % B.replace('\\', '/'), uri=True)
print('=== CSDL B — nhóm trong bảng mau_bang_in ===')
for r in b.execute('SELECT nhom, COUNT(*) FROM mau_bang_in GROUP BY nhom ORDER BY 2 DESC'):
    print('   %-22s %d ô' % (r[0], r[1]))
print()
print('=== ô có DYE trong tên/nhóm/ghi_chú ===')
for r in b.execute("""SELECT id, nhom, ma_mau, nong_do, hex, L_star, a_star, b_star, do_tin_cay
                      FROM mau_bang_in WHERE nhom LIKE '%DYE%' OR ma_mau LIKE '%DYE%' OR ghi_chu LIKE '%dye%'
                      ORDER BY nhom, ma_mau"""):
    print('   ', r)
print()
print('=== danh mục mau: các mã DYE nội bộ MH / phân loại hữu cơ có tồn kho ===')
for r in b.execute("""SELECT id, nhom, ten, ma, phan_loai, hang_ncc, ton_kg, uu_tien, ci_cas
                      FROM mau WHERE nhom LIKE '%MH%' OR phan_loai LIKE '%HỮU CƠ%' OR ten LIKE '%Dye%' ORDER BY id"""):
    print('   ', r)
print()
print('=== tồn kho tất cả mã trong danh mục (kg) ===')
for r in b.execute('SELECT id, ma, ten, ton_kg, uu_tien FROM mau WHERE ton_kg IS NOT NULL ORDER BY ton_kg DESC'):
    print('   %-46s %-10s %-9s ưu tiên %s' % (r[2][:46], r[1], r[3], r[4]))

a = sqlite3.connect('file:%s?mode=ro' % A.replace('\\', '/'), uri=True)
print('\n=== CSDL A — quy trình ===')
for r in a.execute('SELECT id, ten, so_buoc, ghi_chu FROM quy_trinh'):
    print('   id %-4s | %-42s | %s bước | %s' % (r[0], r[1][:42], r[2], (r[3] or '')[:60]))
print('\n=== CSDL A — 34 bước chuẩn ===')
for r in a.execute('SELECT so, ten_vi, dinh_nghia_vi FROM buoc_chuan ORDER BY so'):
    print('   %2s | %-44s | %s' % (r[0], (r[1] or '')[:44], (r[2] or '')[:60]))
print()
print('=== CSDL A — bước của quy trình 112 (Walnut DyeStain), 116 (chuẩn PA1) và 118 (nhánh 2) ===')
for qid in (112, 116, 118):
    t = a.execute('SELECT ten, mo_ta FROM quy_trinh WHERE id=?', (qid,)).fetchone()
    print('  — QT %d: %s | %s' % (qid, t[0], (t[1] or '')[:90]))
    for r in a.execute("""SELECT thu_tu, buoc_nguyen_van, buoc_chuan_so, ghi_chu FROM buoc_quy_trinh
                          WHERE quy_trinh_id=? ORDER BY thu_tu""", (qid,)):
        print('     %2s. %-70s %s' % (r[0], (r[1] or '')[:70], ('[bước %s]' % r[2]) if r[2] else ''))

# ---------- đo màu ----------
def lab(px):
    def f(t):
        t = t / 255.0
        return t / 12.92 if t <= 0.04045 else ((t + 0.055) / 1.055) ** 2.4
    r, g, bb = [f(x) for x in px]
    X = (0.4124564 * r + 0.3575761 * g + 0.1804375 * bb) / 0.95047
    Y = (0.2126729 * r + 0.7151522 * g + 0.0721750 * bb) / 1.00000
    Z = (0.0193339 * r + 0.1191920 * g + 0.9503041 * bb) / 1.08883
    def g2(t):
        return t ** (1 / 3) if t > 0.008856 else (7.787 * t + 16 / 116)
    fx, fy, fz = g2(X), g2(Y), g2(Z)
    return (116 * fy - 16, 500 * (fx - fy), 200 * (fy - fz))

def do(path, ten):
    im = Image.open(path).convert('RGB')
    w, h = im.size
    a_ = np.asarray(im).astype(np.float32)
    # vùng giữa ảnh (bỏ viền/thanh nẹp/băng keo)
    y0, y1 = int(h * 0.18), int(h * 0.82)
    x0, x1 = int(w * 0.10), int(w * 0.90)
    c = a_[y0:y1, x0:x1]
    r, g, bl = c[..., 0], c[..., 1], c[..., 2]
    mx = c.max(axis=2); mn = c.min(axis=2)
    S = np.where(mx > 0, (mx - mn) / np.maximum(mx, 1) * 255, 0)
    V = mx
    # mặt nạ "gỗ": vùng gỗ = bỏ điểm bão hoà cao (băng keo vàng) và điểm rất tối (bóng/viền)
    mask = (V > 60) & (V < 245) & ~((S > 95) & (V > 150))
    print('   %-8s %dx%d | điểm gỗ %d (%.0f%% vùng đo)' % (ten, w, h, mask.sum(), mask.sum() / mask.size * 100))
    px = c[mask]
    med = np.median(px, axis=0)
    L, aa, bb2 = lab(med)
    Ls = np.array([lab(p)[0] for p in px[::max(1, len(px) // 4000)]])
    print('      màu trung vị: #%02X%02X%02X · L* %.1f · a* %+.1f · b* %+.1f | L* P10-P90: %.1f–%.1f' % (
        int(med[0]), int(med[1]), int(med[2]), L, aa, bb2, np.percentile(Ls, 10), np.percentile(Ls, 90)))
    return dict(hex='#%02X%02X%02X' % (int(med[0]), int(med[1]), int(med[2])), L=round(L, 2), a=round(aa, 2), b=round(bb2, 2),
                L_p10=round(float(np.percentile(Ls, 10)), 2), L_p90=round(float(np.percentile(Ls, 90)), 2))

print('\n=== ĐO MÀU 2 ẢNH (code, CIELAB D65) ===')
kq = {'gỗ_mộc': do(os.path.join(IMG, 'img_693c1dd89b22.jpg'), 'gỗ mộc'),
      'mẫu_màu': do(os.path.join(IMG, 'img_91cb13bdfde0.jpg'), 'mẫu màu')}
kq['chenh_lech'] = {k: round(kq['mẫu_màu'][k] - kq['gỗ_mộc'][k], 2) for k in ('L', 'a', 'b')}
print('\n   cần thay đổi (mẫu − mộc): ΔL* %+.2f · Δa* %+.2f · Δb* %+.2f' % tuple(kq['chenh_lech'][k] for k in ('L', 'a', 'b')))
io.open(os.path.join(OUT, '_do_mau_2_anh.json'), 'w', encoding='utf-8').write(json.dumps(kq, ensure_ascii=False, indent=2))
print('lưu:', os.path.join(OUT, '_do_mau_2_anh.json'))
