# -*- coding: utf-8 -*-
r"""B123: chứng minh trang tự đổi khi CSDL cập nhật — dùng BẢN COPY btchem.db + server riêng cổng 8091.
Kịch bản: mở trang -> đọc KPI cont T41 -> SỬA dữ liệu trong bản copy -> chờ ~30 s -> đọc lại KPI (phải đổi)."""
import os, re, shutil, sqlite3, subprocess, sys, time

GOC = r'C:\Claw 2\Nghien cuu\Dashboard-CSDL'
COPY = r'C:\Claw 2\Nghien cuu\Dashboard-CSDL\_test_copy_btchem.db'
THAT = r'C:\c\deepseek-harness\claw2-db\btchem.db'
PY = sys.executable
S = 'dashtest2'

if os.path.exists(COPY):
    os.remove(COPY)
shutil.copy2(THAT, COPY)
print('  bản copy:', COPY, os.path.getsize(COPY), 'byte')

env = dict(os.environ, DASH_DB_BTCHEM=COPY, PYTHONIOENCODING='utf-8')
sv = subprocess.Popen([PY, os.path.join(GOC, 'server_powerbi.py'), '8091'], cwd=GOC, env=env,
                      stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
time.sleep(4)
print('  server test (8091) pid:', sv.pid)


def ba(*a, t=240):
    r = subprocess.run(['browser-act'] + list(a), capture_output=True, text=True, encoding='utf-8',
                       errors='replace', timeout=t)
    return ((r.stdout or '') + (r.stderr or '')).strip()


def ev(js):
    return ba('--session', S, 'eval', js)

lst = ''
for _ in range(4):
    lst = ba('browser', 'list')
    if re.search(r'direct_local_\d+', lst):
        break
    time.sleep(3)
bid = (re.findall(r'(direct_local_\d+)', lst) or ['direct_local_121304831500484624'])[0]
print('  mở trang test:', ba('--session', S, 'browser', 'open', bid, 'http://127.0.0.1:8091/')[-40:])
time.sleep(6)
ev("(()=>{const i=document.querySelector('input[name=mat_khau]'); if(i){i.value='dash-bdd2bb'; i.closest('form').submit();} return 1;})()")
time.sleep(8)
kpi1 = ev("(()=>{const k=document.querySelectorAll('#kpis .kpi')[0]; return k? k.innerText.replace(/\\n/g,' = ') : 'chưa có';})()").strip('"')
nhip1 = ev("(()=>{const c=Chart.getChart('c_cont'); return c? JSON.stringify(c.data.datasets[0].data.slice(-2)) : 'không có';})()").strip('"')
print('  TRƯỚC khi sửa  | KPI:', kpi1, '| chart cont 2 tuần cuối:', nhip1)

con = sqlite3.connect(COPY, timeout=30)
truoc = con.execute("select sum(so_cont) from bao_cao_sx where tuan='T41'").fetchone()[0]
nm = con.execute("select id from nha_may where ten like 'Hố Nai%' order by id limit 1").fetchone()[0]
con.execute("update bao_cao_sx set so_cont = so_cont + 100 where tuan='T41' and nha_may_id=?", (nm,))
con.commit()
sau = con.execute("select sum(so_cont) from bao_cao_sx where tuan='T41'").fetchone()[0]
con.close()
print('  ĐÃ SỬA bản copy: T41 tổng cont %.1f -> %.1f (+100)' % (truoc, sau))

print('  chờ 35 giây để trang tự phát hiện (dò nhịp mỗi 20 s)…')
time.sleep(35)
kpi2 = ev("(()=>{const k=document.querySelectorAll('#kpis .kpi')[0]; return k? k.innerText.replace(/\\n/g,' = ') : 'chưa có';})()").strip('"')
nhip2 = ev("(()=>{const c=Chart.getChart('c_cont'); return c? JSON.stringify(c.data.datasets[0].data.slice(-2)) : 'không có';})()").strip('"')
toast = ev("(()=>{const t=document.getElementById('toast'); return (t&&t.style.display!=='none')? t.textContent : '(không hiện)';})()").strip('"')
print('  SAU khi sửa   | KPI:', kpi2, '| chart cont 2 tuần cuối:', nhip2, '| thông báo:', toast)
print('  KẾT LUẬN: tự đổi theo CSDL =', 'ĐẠT' if kpi2 != kpi1 else 'CHƯA ĐẠT')

ev("1")
sv.terminate()
time.sleep(2)
try:
    sv.kill()
except Exception:
    pass
os.remove(COPY) if os.path.exists(COPY) else None
print('  đã dừng server test và xoá bản copy:', not os.path.exists(COPY))
