# -*- coding: utf-8 -*-
"""Thống kê CSDL KPH 823 hồ sơ: theo năm/tháng, loại, khách, nhóm hiện tượng (để đối chiếu portal)."""
import sqlite3, re, json, io, unicodedata
from collections import Counter, defaultdict

KH = r"C:\Claw\Khieu Nai KHach Hang\btchem_kph.db"
con = sqlite3.connect(KH, timeout=60)
con.row_factory = sqlite3.Row

def norm(s):
    s = (s or "").lower()
    s = s.replace("đ", "d")
    s = unicodedata.normalize("NFD", s)
    return "".join(c for c in s if unicodedata.category(c) != "Mn")

rows = con.execute("""SELECT h.id, h.ngay_nhan, h.loai_hs, h.sheet, h.san_pham_raw, h.hien_tuong_raw,
                             h.mo_ta, h.ket_qua_kiem_tra, h.nguyen_nhan, h.phuong_an, h.cap_nhat,
                             k.ten AS khach
                      FROM ho_so_kph h LEFT JOIN khach_hang k ON k.id = h.id_kh""").fetchall()

def parse_year(d):
    d = (d or "").strip()
    m = re.match(r"^(\d{1,2})[/-](\d{1,2})[/-](\d{4})", d)          # dd/mm/yyyy
    if m: return int(m.group(3)), int(m.group(2))
    m = re.match(r"^(\d{4})-(\d{1,2})-(\d{1,2})", d)                 # yyyy-mm-dd
    if m: return int(m.group(1)), int(m.group(2))
    m = re.search(r"(20\d{2})", d)
    if m: return int(m.group(1)), 0
    return 0, 0

PHAN_NHOM = [
    ("A. Sai màu / lệch màu / không tái lập màu", r"sai mau|lech mau|lech tone|nga vang|khong dung mau|mau (bi )?(sai|lech)|kem vang|dam hon"),
    ("B. Bám dính kém / tróc – bong lớp", r"troc|bong|bam dinh|do bam"),
    ("C. Khuyết tật bề mặt màng sơn", r"dom|lo kim|dau tay|khong deu|soc|nham|bui|vet|hoi nuoc|trang duc"),
    ("D. Dính khi xếp chồng / đóng gói (blocking)", r"dinh (mut|foam|carton|giay|vet)|xep chong|blocking|cham kho"),
    ("E. Sai độ bóng / lõm dầu / nghẹt lưới lọc", r"do bong|lom dau|nghet luoi|bong cao|bong thap"),
    ("F. Nguyên liệu – sơn đầu vào (lắng cặn, tách lớp)", r"lang|can|tach lop|von cuc|ket tua|xi dau|xi vang"),
    ("G. Phôi – tiền xử lý – tái chế", r"ghim|xu ghim|tai che|can mop|nut|curoc|chua nhan|ke khe|phan tich go"),
]
def nhom(txt):
    t = norm(txt)
    for name, pat in PHAN_NHOM:
        if re.search(pat, t): return name
    return "H. Khác / chưa xác định nhóm"

years, months26, nhom_c, khach_c = Counter(), Counter(), Counter(), Counter()
nam_2026 = []
for r in rows:
    y, m = parse_year(r["ngay_nhan"])
    if y: years[y] += 1
    if y == 2026 and m: months26[m] += 1
    txt = " ".join(filter(None, [r["hien_tuong_raw"], r["mo_ta"], r["san_pham_raw"], r["ket_qua_kiem_tra"]]))[:4000]
    nhom_c[nhom(txt)] += 1
    if r["khach"]: khach_c[r["khach"]] += 1
    if y == 2026: nam_2026.append(r["id"])

out = {
    "tong": len(rows),
    "theo_loai": dict(Counter(r["loai_hs"] for r in rows)),
    "theo_sheet": dict(Counter(r["sheet"] for r in rows)),
    "theo_nam": dict(sorted(years.items())),
    "thang_2026": dict(sorted(months26.items())),
    "theo_nhom": dict(nhom_c.most_common()),
    "top_khach": dict(khach_c.most_common(15)),
    "so_ho_so_2026": len(nam_2026),
}
print(json.dumps(out, ensure_ascii=False, indent=1))
json.dump(out, io.open(r"C:\Claw 2\QC\Base\kph_stats.json", "w", encoding="utf-8"), ensure_ascii=False, indent=1)
con.close()
