import asyncio
import json
import sys

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

from mcp.client.sse import sse_client
from mcp.client.session import ClientSession

import os
sys.path.insert(0, os.path.abspath("."))

# Import catalog from test_mem0_verification
from tests.test_mem0_verification import VERIFICATION_CATALOG, is_dscons_record

async def test_remediation():
    async with sse_client("http://127.0.0.1:8765/sse") as (read, write):
        async with ClientSession(read, write) as session:
            await session.initialize()
            
            for entry in VERIFICATION_CATALOG:
                # 1. Project scoping
                res = await session.call_tool("mem0_search", {"query": entry["query"], "limit": 5, "project": "DSCons"})
                data = json.loads(res.content[0].text)
                results = data.get("memories", {}).get("results", [])
                
                # Clean forbidden keywords: remove false positives
                clean_forbidden = [
                    f for f in entry["forbidden_keywords"] 
                    if f not in ["FLOAT cho tiền tệ", "DOUBLE cho tiền tệ", "scaffolding rỗng"]
                ]
                
                top1 = results[0] if results else {}
                top1_score = top1.get("score", 0.0)
                top1_text = top1.get("memory", "")
                top3 = results[:3]
                
                score_pass = top1_score >= 0.55
                top1_is_dscons = is_dscons_record(top1)
                top3_ratio = sum(1 for r in top3 if is_dscons_record(r)) / len(top3) if top3 else 0
                domain_pass = top1_is_dscons and top3_ratio >= 0.66
                
                # Check keyword in top-1 vs top-3
                top1_kw = None
                for kw in entry["expected_keywords"]:
                    if kw.lower() in top1_text.lower():
                        top1_kw = kw
                        break
                
                top3_kw = None
                top3_text = " ".join(r.get("memory", "") for r in top3)
                for kw in entry["expected_keywords"]:
                    if kw.lower() in top3_text.lower():
                        top3_kw = kw
                        break
                
                # Contamination check with cleaned forbidden list
                contam_reasons = []
                for i, r in enumerate(top3):
                    r_text = r.get("memory", "")
                    for fkw in clean_forbidden:
                        if fkw.lower() in r_text.lower():
                            contam_reasons.append(f"Hit #{i+1} has {fkw}")
                
                clean_pass = len(contam_reasons) == 0
                
                print(f"[{entry['id']}] {entry['query']:<22} | Score={top1_score:.4f} ({score_pass}) | Dom=({domain_pass}) | Clean=({clean_pass}) | Top1_KW={top1_kw} | Top3_KW={top3_kw}")

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