import asyncio
import json
import math
import re
import hashlib
from typing import List, Dict, Any, Optional
from mcp.client.sse import sse_client
from mcp.client.session import ClientSession

class PureVectorEmbedder:
    def __init__(self):
        self.dims = 768

    def embed(self, text: str) -> List[float]:
        vec = [0.0] * self.dims
        words = re.findall(r"\w+", text.lower(), re.UNICODE)
        if not words:
            return vec

        for w in words:
            h = int(hashlib.sha256(w.encode("utf-8")).hexdigest(), 16) % self.dims
            vec[h] += 1.0
            for i in range(len(w) - 2):
                ngram = w[i:i+3]
                nh = int(hashlib.md5(ngram.encode("utf-8")).hexdigest(), 16) % self.dims
                vec[nh] += 0.5

        norm = math.sqrt(sum(x * x for x in vec))
        if norm > 0:
            vec = [x / norm for x in vec]
        return vec

def cosine_similarity(v1: List[float], v2: List[float]) -> float:
    return sum(a * b for a, b in zip(v1, v2))

async def inspect_live_mem0():
    embedder = PureVectorEmbedder()
    async with sse_client("http://127.0.0.1:8765/sse") as (read, write):
        async with ClientSession(read, write) as session:
            await session.initialize()
            
            # 1. Status
            status_res = await session.call_tool("mem0_status", {})
            status_data = json.loads(status_res.content[0].text)
            print("Status:", json.dumps(status_data, indent=2))
            
            # 2. Get all
            all_res = await session.call_tool("mem0_get_all", {"user_id": "developer", "limit": 1000})
            all_data = json.loads(all_res.content[0].text)
            results = all_data.get("memories", {}).get("results", [])
            print(f"Total retrieved memories: {len(results)}")
            
            dscons_mems = []
            non_dscons_mems = []
            for r in results:
                meta = r.get("metadata") or {}
                proj = str(meta.get("project", "")).strip().lower()
                text = r.get("memory", "")
                if proj == "dscons" or text.startswith("[DSCons") or "DSCons ERP" in text:
                    dscons_mems.append(r)
                else:
                    non_dscons_mems.append(r)
                    
            print(f"DSCons memories count: {len(dscons_mems)}")
            print(f"Non-DSCons memories count: {len(non_dscons_mems)}")
            
            # Save dump of dscons IDs
            dscons_ids = [m["id"] for m in dscons_mems]
            print(f"DSCons IDs list length: {len(dscons_ids)}")
            
            with open("c:/Projects/DSCons/.agents/teamwork/teamwork_preview_explorer_remediation_2/current_dscons_ids.json", "w", encoding="utf-8") as f:
                json.dump(dscons_mems, f, indent=2, ensure_ascii=False)
                
            return dscons_mems, non_dscons_mems

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