# -*- coding: utf-8 -*-
r"""B37: KIỂM CHỨNG bản cô đọng của subagent với nguồn gốc.
- Mọi "con số có ý nghĩa" trong bản cô đọng phải XUẤT HIỆN trong nguồn tương ứng.
- In danh sách số KHÔNG tìm thấy (nghi bịa / bị đổi định dạng) để người kiểm xử lý.
"""
import os, re, collections

D = r'C:\Claw 2\QC\_tomtat_2809_1010'
CAP = (('LOC', 'NGUON_LOC.md', 'TOM_LOC.md'), ('TRI', 'NGUON_TRI.md', 'TOM_TRI.md'))

# con số "có ý nghĩa": có dấu phẩy/chấm thập phân, hoặc %, hoặc >=2 chữ số kèm đơn vị
RE_SO = re.compile(r'\d+(?:[.,]\d+)?\s*(?:%|B/5B|B/4B|B/3B|B|giờ|h\b|phút|giây|m²|kg|cm²|cont|lô|tấm|nền|bước|mẫu|độ|°C|%)?', re.U)


def chuan_hoa(s):
    return (s.replace('\u00a0', ' ').replace('\r', '')
            .replace('ΔE', 'dE').replace('∆E', 'dE'))


for ten, fnguon, ftom in CAP:
    pn, pt = os.path.join(D, fnguon), os.path.join(D, ftom)
    if not os.path.exists(pt):
        print('  %-4s chưa có %s' % (ten, ftom)); continue
    ng = chuan_hoa(open(pn, encoding='utf-8', errors='replace').read())
    tm = chuan_hoa(open(pt, encoding='utf-8', errors='replace').read())
    # bảng "số nguyên văn" trong nguồn
    so_nguon = collections.Counter(m.group(0).strip() for m in RE_SO.finditer(ng))
    so_tom = [m.group(0).strip() for m in RE_SO.finditer(tm)]
    thieu = []
    for s in set(so_tom):
        if len(s) < 3:
            continue
        if s not in so_nguon and s.replace(' ', '') not in ng.replace(' ', ''):
            thieu.append(s)
    # thử lại dạng không có khoảng trắng / đổi dấu
    thieu2 = []
    for s in thieu:
        bien = {s, s.replace(' ', ''), s.replace(',', '.'), s.replace('.', ',')}
        if not any(b in ng for b in bien):
            thieu2.append(s)
    print('  %-4s bản cô đọng %6d ký tự | nguồn %6d ký tự | số đã dùng %4d | KHÔNG thấy trong nguồn: %d'
          % (ten, len(tm), len(ng), len(set(so_tom)), len(thieu2)))
    if thieu2:
        print('       -> %s' % ', '.join(sorted(thieu2)[:40]))
    # kiểm tra mục bắt buộc
    for nhan in ('TỔNG HỢP ĐIỂM CHỜ', 'MÃ MÀU'):
        print('       %-22s %s' % (nhan, 'CÓ' if nhan in tm.upper() else 'THIẾU'))
    emoji = [c for c in tm if ord(c) > 0x2100 and c not in '—–≥≤Δ∆²³°…“”‘’']
    print('       emoji/ký tự lạ: %d | có dấu **: %d' % (len(emoji), tm.count('**')))
