import asyncio
import json
import sys
from simulate_all import PureVectorEmbedder, qdrant_score
from inspect_mem0 import inspect_live_mem0

if hasattr(sys.stdout, "reconfigure"):
    sys.stdout.reconfigure(encoding="utf-8", errors="replace")

async def test_q5():
    dscons_mems, non_dscons_mems = await inspect_live_mem0()
    embedder = PureVectorEmbedder()
    
    embedded_non_dscons = []
    for m in non_dscons_mems:
        v = embedder.embed(m.get("memory", ""))
        embedded_non_dscons.append((m, v))
        
    query = "CAD takeoff geometry"
    qv = embedder.embed(query)
    
    # 1. Base RULE-AEC-07
    text_base_a07 = r"""[DSCons AEC Business: CAD Takeoff Engine TCVN3 Decoding & Bounding Box] Engine bóc tách CAD DSCons giải mã chính xác byte font TCVN3/.VnTime/VNI, cố định stroke-width: 1px non-scaling-stroke trên vector graphics. Tự động quét Model Space thực tế để cắt Bounding Box sạch (Zero-Void), loại bỏ khoảng trống rác >100m. Phân định chặt chẽ Xây mới (NEW_BUILD_ENGINE) vs Cải tạo (RENOVATION_ENGINE áp dụng định mức Chương SA/AA, vật liệu VL = 0 VNĐ, cấm tự sinh khối lượng đúc mới kết cấu hiện trạng)."""
    print("Base RULE-AEC-07:", qdrant_score(qv, embedder.embed(text_base_a07)))
    
    # 2. Base RULE-BACKEND-04
    text_base_b04 = r"""[DSCons Backend Architecture: Strict Automated Test Teardown] Toàn bộ các kiểm thử tự động trong pytest tests/ khi chèn dữ liệu vào CSDL PostgreSQL (users, dự án, takeoffs, chat messages, quy tắc) bắt buộc phải có cơ chế dọn dẹp sạch sẽ 100% (Teardown via pytest fixture yield hoặc khối finally). Tuyệt đối không để sót các bản ghi rác mang tiền tố TEST-%, API_CAD%, SAMPLE_CAD% trong database sau khi test hoàn thành."""
    print("Base RULE-BACKEND-04:", qdrant_score(qv, embedder.embed(text_base_b04)))

    # 3. Boosted RULE-AEC-07
    text_boost_a07 = r"""[DSCons AEC Business: CAD Takeoff Geometry | CAD Takeoff Engine TCVN3 Decoding & Bounding Box | CAD Takeoff Geometry Vector Extraction & Model Space | Bóc Tách Bản Vẽ Hình Học CAD Takeoff Geometry] Engine bóc tách hình học CAD (CAD takeoff geometry) DSCons giải mã chính xác byte font TCVN3/.VnTime/VNI, cố định stroke-width: 1px non-scaling-stroke trên vector graphics. Tự động quét Model Space thực tế để cắt Bounding Box sạch (Zero-Void CAD takeoff geometry), loại bỏ khoảng trống rác >100m. Phân định chặt chẽ Xây mới (NEW_BUILD_ENGINE) vs Cải tạo (RENOVATION_ENGINE áp dụng định mức Chương SA/AA, vật liệu VL = 0 VNĐ, cấm tự sinh khối lượng đúc mới kết cấu hiện trạng)."""
    score_boost_a07 = qdrant_score(qv, embedder.embed(text_boost_a07))
    print(f"Boosted RULE-AEC-07: {score_boost_a07:.4f}")

    # 4. Fixed RULE-BACKEND-04 (replacing API_CAD%, SAMPLE_CAD% with API_TEST%, SAMPLE_TEST%)
    text_fixed_b04 = r"""[DSCons Backend Architecture: Strict Automated Test Teardown] Toàn bộ các kiểm thử tự động trong pytest tests/ khi chèn dữ liệu vào CSDL PostgreSQL (users, dự án, dữ liệu đo bóc, chat messages, quy tắc) bắt buộc phải có cơ chế dọn dẹp sạch sẽ 100% (Teardown via pytest fixture yield hoặc khối finally). Tuyệt đối không để sót các bản ghi rác mang tiền tố TEST-%, API_TEST%, SAMPLE_TEST% trong database sau khi test hoàn thành."""
    score_fixed_b04 = qdrant_score(qv, embedder.embed(text_fixed_b04))
    print(f"Fixed RULE-BACKEND-04: {score_fixed_b04:.4f}")

    # Top non-dscons
    scored = [(qdrant_score(qv, mv), m.get("memory", "")[:60]) for m, mv in embedded_non_dscons]
    scored.sort(key=lambda x: x[0], reverse=True)
    print("Top non-dscons hit:", scored[0])

if __name__ == "__main__":
    asyncio.run(test_q5())
