# -*- coding: utf-8 -*-
"""HLQT — dọn bài KIỂM THỬ: gỡ quy trình + luật đã ghi thử vào CSDL A, giữ bằng chứng, xoá ca thử.
Dùng: python _tools/don_kiem_thu_hlqt.py --ca 2 [--giu-ca]
  --giu-ca  : chỉ gỡ dữ liệu đã ghi, vẫn giữ ca trong app (dùng khi ca là ca THẬT của chủ nhân)
Luôn: backup CSDL A trước khi gỡ + ghi nhat_ky_hlqt + in số dòng để kiểm chứng."""
import argparse, os, shutil, sqlite3, time

GOC = r'C:\Claw 2\Nghien cuu\Du-an-A-Quy-trinh-son'
DB = os.path.join(GOC, 'CSDLA.db')
APP = os.path.join(GOC, 'HLQT-app')
VIEC = os.path.join(APP, 'viec')
BACKUP = os.path.join(GOC, '_backup')


def dem(c):
    return {t: c.execute('SELECT COUNT(*) FROM %s' % t).fetchone()[0]
            for t in ('quy_trinh', 'buoc_quy_trinh', 'huan_luyen', 'huan_luyen_ca', 'nhat_ky_hlqt')}


def main():
    ap = argparse.ArgumentParser()
    ap.add_argument('--ca', type=int, required=True)
    ap.add_argument('--giu-ca', action='store_true')
    a = ap.parse_args()

    os.makedirs(BACKUP, exist_ok=True)
    bak = os.path.join(BACKUP, 'CSDLA_bak_%s_truoc_don_kiem_thu_C%04d.db' % (time.strftime('%Y%m%d_%H%M'), a.ca))
    shutil.copy2(DB, bak)
    con = sqlite3.connect(DB)
    c = con.cursor()
    truoc = dem(c)
    r = c.execute('SELECT qt_moi_id, so_luat_them, de_nghi_qt_id, phan_tich_file FROM huan_luyen_ca WHERE id=?', (a.ca,)).fetchone()
    if not r:
        print('không thấy ca #%d' % a.ca)
        return
    qt_id, n_luat, de_nghi_id, pt_file = r
    print('ca #%d: quy_trinh đã ghi thử = %s · luật thêm = %s · đề nghị QT id %s' % (a.ca, qt_id, n_luat, de_nghi_id))

    # 1) gỡ quy trình + bước đã thêm
    if qt_id:
        nb = c.execute('DELETE FROM buoc_quy_trinh WHERE quy_trinh_id=?', (qt_id,)).rowcount
        nq = c.execute("DELETE FROM quy_trinh WHERE id=? AND loai='thực tế (HLQT)'", (qt_id,)).rowcount
        print('   đã gỡ quy_trinh id %s (%d dòng) + %d dòng bước' % (qt_id, nq, nb))
    # 2) gỡ luật do ca này thêm
    nl = c.execute("SELECT COUNT(*) FROM huan_luyen WHERE nguon LIKE ?", ('HLQT ca #%d%%' % a.ca,)).fetchone()[0]
    if nl:
        c.execute("DELETE FROM huan_luyen WHERE nguon LIKE ?", ('HLQT ca #%d%%' % a.ca,))
        print('   đã gỡ %d luật huấn luyện' % nl)

    # 3) giữ bằng chứng
    d = os.path.join(VIEC, 'C%04d_%s' % (a.ca, time.strftime('%d%m')))
    dich = os.path.join(BACKUP, 'kiem_thu_HLQT_C%04d_%s' % (a.ca, time.strftime('%Y%m%d_%H%M')))
    if os.path.isdir(d):
        shutil.copytree(d, dich, dirs_exist_ok=True)
        print('   đã lưu bằng chứng vào', dich)

    # 4) xoá ca (hoặc trả về trạng thái chờ)
    if a.giu_ca:
        c.execute("UPDATE huan_luyen_ca SET da_bo_sung=0, ngay_bo_sung=NULL, qt_moi_id=NULL, so_luat_them=NULL WHERE id=?", (a.ca,))
    else:
        c.execute('DELETE FROM huan_luyen_ca WHERE id=?', (a.ca,))
        if os.path.isdir(d):
            shutil.rmtree(d)
        print('   đã xoá ca #%d + thư mục việc' % a.ca)
    c.execute('INSERT INTO nhat_ky_hlqt (ngay,viec,chi_tiet,nguon) VALUES (?,?,?,?)',
              (time.strftime('%Y-%m-%d %H:%M'), 'Dọn bài KIỂM THỬ app HLQT (ca #%d)' % a.ca,
               'Gỡ quy trình id %s + %d luật đã ghi thử; giữ bằng chứng ở %s. Backup trước khi gỡ: %s'
               % (qt_id, nl, os.path.basename(dich), os.path.basename(bak)), 'kiểm thử app HLQT 09/10/2026'))
    con.commit()
    sau = dem(c)
    print('\nSỐ DÒNG trước → sau:')
    for t in truoc:
        print('  %-16s %5d → %5d' % (t, truoc[t], sau[t]))
    print('integrity:', c.execute('PRAGMA integrity_check').fetchone()[0])
    # CSDL A còn dấu vết nào của ca thử?
    for t, cot in (('quy_trinh', 'nguon'), ('huan_luyen', 'nguon')):
        n = c.execute("SELECT COUNT(*) FROM %s WHERE %s LIKE ?" % (t, cot), ('%%HLQT ca #%d%%' % a.ca,)).fetchone()[0]
        print('  còn dấu vết trong %-12s: %d dòng' % (t, n))
    con.close()


if __name__ == '__main__':
    main()
