# -*- coding: utf-8 -*-
r"""B189: go toan bo phan CSDL C khoi dashboard (tab_api.py + server_powerbi.py).
Xoa theo ANCHOR dòng (không phụ thuộc thụt lề) + khoá an toàn: mọi thao tác phải khớp, nếu không thì KHÔNG ghi."""
import io, os, re, shutil, subprocess, sys, datetime

GOC = r'C:\Claw 2\Nghien cuu\Dashboard-CSDL'
TS = datetime.datetime.now().strftime('%Y%m%d_%H%M')


def nap(f):
    return io.open(os.path.join(GOC, f), encoding='utf-8').read()


def ghi(f, t):
    p = os.path.join(GOC, f)
    io.open(p + '.tmp_ghi', 'w', encoding='utf-8', newline='').write(t)
    os.replace(p + '.tmp_ghi', p)


def xoa_dong(t, chuoi, mong):
    ra, n = [], 0
    for l in t.split('\n'):
        if chuoi in l:
            n += 1
        else:
            ra.append(l)
    assert n == mong, 'xoa_dong %r: khop %d (mong %d)' % (chuoi[:50], n, mong)
    return '\n'.join(ra)


def xoa_doan(t, dau, cuoi):
    i = t.find(dau)
    assert i > 0, 'xoa_doan: khong thay dau %r' % dau[:60]
    j = t.find(cuoi, i)
    assert j > 0, 'xoa_doan: khong thay cuoi %r' % cuoi[:60]
    j = t.find('\n', j) + 1
    i = t.rfind('\n', 0, i) + 1
    return t[:i] + t[j:]


# ═══ tab_api.py ═══════════════════════════════════════════════════════════
t = nap('tab_api.py')
shutil.copy2(os.path.join(GOC, 'tab_api.py'), os.path.join(GOC, '_tab_api_truoc_go_CSDLC_%s.bak' % TS))
n0 = len(t)

t = xoa_dong(t, "c = mo('csdlc')", 3)                                   # 3 hàm tab_*
t = xoa_dong(t, "'Khách hàng (CSDL C)')", 1)
t = xoa_dong(t, "'Khách nhóm A (CSDL C)')", 1)
t = xoa_dong(t, "'Bài học kinh nghiệm (CSDL C)')", 1)
t = t.replace("'btchem.db · CSDLC.db · CSDLA.db'", "'btchem.db · CSDLA.db'")
t = t.replace("(bảng mua_hang / mua_hang_tong_quan, ghép CSDLC.khach_hang)", "(bảng mua_hang / mua_hang_tong_quan)")
t = t.replace("mua_hang_tong_quan) · CSDLC.db (khach_hang, lich_su_mua_hang)'", "mua_hang_tong_quan)'")
t = t.replace("'btchem.db (su_co_kph) · CSDLC.db (kinh_nghiem)'", "'btchem.db (su_co_kph)'")
assert t.count('b.close(); c.close()') == 2, 'khong thay 2 cho dong ket noi'
t = t.replace('b.close(); c.close()', 'b.close()')
# khối bán hàng: nhóm/loại khách (CSDL C)
t = xoa_doan(t, '# kg theo nhóm / loại khách (ghép CSDLC theo tên chuẩn hoá)',
             "tieu_de='Cơ cấu Kg theo loại khách', kieu='pie'))")
# bảng Top khách hàng (CSDL C)
i = t.find('tong_kg_2026')
assert i > 0, 'khong thay bang top khach CSDL C'
i_dau = t.rfind('hang = [', 0, i)
j = t.find("'Khách hàng (CSDL C)'", i)
j = t.find(']))', j) + 4
t = t[:i_dau] + t[j:]
# khối bài học theo tháng + bảng chủ đề bài học
t = xoa_doan(t, '# bài học kinh nghiệm (CSDL C) theo tháng',
             "'don_vi': 'bài', 'ngang': False, 'mau': MAU[4]})")
t = xoa_doan(t, 'the.append(cot_ngang(doc(c, """select coalesce(nullif(trim(chu_de)',
             "'bài', 15, 'Chủ đề bài học kinh nghiệm nhiều nhất'))")
# đóng danh sách KPI còn lại (dòng trước 'Khách nhóm A' / 'Bài học' đang kết thúc bằng dấu phẩy)
for kpi_cu in ("'Khách nhóm A (CSDL C)'", "'Bài học kinh nghiệm (CSDL C)'"):
    pass
t = t.replace("'Thiếu ngày tạo'),\n", "'Thiếu ngày tạo')]\n")
t = t.replace("'Tổng kg lũy kế'),\n", "'Tổng kg lũy kế')]\n")
ghi('tab_api.py', t)
print('  tab_api.py: %d -> %d byte (giam %d)' % (n0, len(t), n0 - len(t)))

# ═══ server_powerbi.py ═══════════════════════════════════════════════════
s = nap('server_powerbi.py')
shutil.copy2(os.path.join(GOC, 'server_powerbi.py'), os.path.join(GOC, '_server_powerbi_truoc_go_CSDLC_%s.bak' % TS))
n1 = len(s)
s = xoa_dong(s, "'csdlc': os.environ.get('DASH_DB_CSDLC')", 1)
s = xoa_dong(s, "'csdlc': [('khach_hang', 'count(*)')", 1)
s = xoa_dong(s, "('lich_su_mua_hang', 'count(*)')]", 1)
s = xoa_dong(s, "cl = sqlite3.connect('file:%s?mode=ro' % DB['csdlc']", 1)
s = xoa_dong(s, "'khach_hang': dem(cl, 'select count(*) from khach_hang')", 1)
s = xoa_dong(s, "'kinh_nghiem': dem(cl, 'select count(*) from kinh_nghiem')", 1)
s = re.sub(r"\n[ \t]*cl\.close\(\)", '', s)
ghi('server_powerbi.py', s)
print('  server_powerbi.py: %d -> %d byte (giam %d)' % (n1, len(s), n1 - len(s)))

# ═══ KIỂM CHỨNG ══════════════════════════════════════════════════════════
print('\n  === cu phap:')
for f in ('tab_api.py', 'server_powerbi.py'):
    r = subprocess.run([sys.executable, '-m', 'py_compile', os.path.join(GOC, f)], capture_output=True, text=True)
    print('     %-20s %s' % (f, 'OK' if r.returncode == 0 else 'LOI: ' + r.stderr.strip()[-300:]))
print('  === con nhac CSDL C?')
for f in ('tab_api.py', 'server_powerbi.py'):
    t2 = nap(f)
    con = [l.strip()[:88] for l in t2.split('\n') if re.search(r'csdlc|CSDL C|kinh_nghiem|CSDLC', l, re.I)]
    print('     %-20s %d dong %s' % (f, len(con), con[:3]))
