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

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

async def run_final_check():
    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))
        
    embedded_facts = []
    for f in BOOSTED_FACTS_CATALOG:
        v = embedder.embed(f["text"])
        embedded_facts.append((f, v))
        
    queries = [
        ("Q1", "DSCons rule", ["Bảy Điều luật", "cốt lõi", "synthetic data", "Định Sơn", "0202111150", "lục giác", "Hexagonal"]),
        ("Q2", "frontend theme", ["Dark Slate", "#0b0f19", "#080d1a", "Inter", "JetBrains Mono", "Bloomberg", "erp_enterprise.css"]),
        ("Q3", "backend architecture", ["Clean Architecture", "DDD", "NUMERIC(18, 4)", "Decimal", "Ports", "4-Layer", "4 tầng"]),
        ("Q4", "AEC pricing norms", ["Thông tư 38", "cừ Larsen", "VL = 0", "MR / T", "MR/T", "G_XD", "Định mức"]),
        ("Q5", "CAD takeoff geometry", ["TCVN3", "stroke-width: 1px", "Bounding Box", "Chương SA", ".VnTime", "Zero-Void"]),
        ("Q6", "database precision", ["NUMERIC(18, 4)", "Decimal", "Sổ kép", "Double-entry", "18, 4"]),
        ("Q7", "testing workflow", ["Deep Matrix", "D1-D6", "D1 Đến D6", "TDD", "task.md", "Verification", "80%"]),
        ("Q8", "MCP tools protocol", ["lsp-mcp", "chrome-devtools-mcp", "markitdown", "memory", "StitchMCP"]),
        ("VN-04", "bảng màu frontend", ["Dark Slate", "bảng màu", "palette"]),
        ("EN-04", "frontend color palette", ["Dark Slate", "color palette"]),
        ("VN-06", "độ chính xác số thực database", ["NUMERIC(18, 4)", "Decimal"]),
        ("EDGE-03", "kien truc backend luc giac", ["Clean Architecture", "DDD"]),
    ]
    
    print("\n=================== VERIFYING FINAL BOOSTED 27-FACT CATALOG ===================")
    all_pass = True
    for q_id, q_text, expected_kws in queries:
        qv = embedder.embed(q_text)
        
        scored = []
        for f, fv in embedded_facts:
            sim = qdrant_score(qv, fv)
            scored.append((sim, True, f["code"], f["text"]))
        for m, mv in embedded_non_dscons:
            sim = qdrant_score(qv, mv)
            text = m.get("memory", "")
            scored.append((sim, False, m.get("id"), text))
            
        scored.sort(key=lambda x: x[0], reverse=True)
        
        top1 = scored[0]
        top3 = scored[:3]
        dscons_in_top3 = sum(1 for x in top3 if x[1])
        is_top1_dscons = top1[1]
        
        kw_match = False
        matched = ""
        for kw in expected_kws:
            if kw.lower() in top1[3].lower():
                kw_match = True
                matched = kw
                break
                
        status = "PASS" if (is_top1_dscons and top1[0] >= 0.55 and dscons_in_top3 >= 2 and (kw_match or not expected_kws)) else "FAIL"
        if status == "FAIL":
            all_pass = False
        print(f"[{status}] {q_id:<8} | Top1: {top1[0]:.4f} ({'DSCons' if is_top1_dscons else 'NON-DSC'} - {top1[2]}) | Top3 DSC: {dscons_in_top3}/3 | KwMatch: {kw_match} ({matched})")
        if status == "FAIL" or dscons_in_top3 < 3:
            for rank, hit in enumerate(top3, 1):
                code_or_id = hit[2] if hit[1] else f"FOREIGN({hit[2][:8]})"
                print(f"       #{rank}: {hit[0]:.4f} | {'DSCons' if hit[1] else 'FOREIGN'} | {code_or_id} | {hit[3][:75]}")

    print(f"\nFinal candidate verdict: {'ALL PASSED 100%' if all_pass else 'SOME FAILED'}")

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