import pytest
import asyncio
import json
import sys
from mcp.client.sse import sse_client
from mcp.client.session import ClientSession

DELETED_UUIDS = [
    "8f784c03-12c2-4e2e-ad27-c9126339a397",
    "56c96009-a86d-4f77-9741-d4bf2db91186",
    "3fe6685d-0dc2-4620-9fc3-d4dae6d1a827",
    "3ae63e6e-ec8c-413d-9ed3-7309719bbb1a",
    "710970c5-f250-49c3-a45c-e3dafc03234d",
    "1c80e96d-1953-46cf-bd25-e886176c294c",
    "5c85fded-a035-4580-8c3e-c7e6db87ccfe",
    "735d2967-c794-43e3-ba2d-91336fca8c05",
    "777fa33d-3de1-4b8b-8edb-2ac3249d4dd1",
    "8ce4fbab-615f-49d5-a170-8a68c0006b58",
    "c8c9e303-56ef-40b7-b540-75e16ce7fba2",
    "df49c0cd-cc16-4243-a89d-4e26f0bb1ed4",
    "e41cb24f-c679-45d6-bd73-08504a4d5df7",
    "ffaa5396-8d31-44de-8d7e-330686bb7253",
    "9a3be66a-538b-43cd-afe5-f9c99eeeb7d9",
    "af959e89-7f6b-42cc-b70c-b312d568164d",
    "05dfee8c-9873-4f58-8c02-e9356267b1da",
    "3172e150-bfdf-4e1b-9140-ef9c2131e254",
    "a6c7ff66-981f-4922-b5d7-ebc00cf08342",
    "a1505cb1-23f7-4e80-a7ab-0ef1402e58f0",
    "88388e27-9b76-4a8f-a2a8-88552898ec10",
    "adebc49b-b740-4c8d-9719-e07598e283b8",
    "ef2d2b14-85fe-497d-973d-03f856445094",
    "385dc9bd-a317-45fc-a8a5-c8fab236e31b",
    "38dfd0cf-7359-432e-9c07-fbdbee4721eb",
    "617c66ff-39a1-46e0-b422-9c87ad4b7d78",
    "d4d86547-0ebb-4fd4-9fec-fc3665f300d0",
    "0df1595a-9ef5-4012-ae6f-82808dba93e1",
    "5dcc1be8-7216-47a3-8285-dc5b81ffe324",
    "305689dc-261a-4cbc-831a-54bfd70eae77",
    "bab3dbc0-2f3c-49ad-b416-a9f4f8077dbf"
]

@pytest.mark.asyncio
async def test_mem0_status_count_is_449():
    """Verify integrated count is 476 while non-DSCons baseline remains exactly 449."""
    async with sse_client("http://127.0.0.1:8765/sse") as (read, write):
        async with ClientSession(read, write) as session:
            await session.initialize()
            res = await session.call_tool("mem0_status", {})
            data = json.loads(res.content[0].text)
            assert data.get("status") == "online"
            assert data.get("developer_memories_count") == 476

            # Verify exact preservation of 449 non-DSCons baseline memories
            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", [])
            dscons = [r for r in results if (r.get("metadata") or {}).get("project") == "DSCons"]
            assert len(dscons) == 27
            non_dscons_baseline = data.get("developer_memories_count") - len(dscons)
            assert non_dscons_baseline == 449

@pytest.mark.asyncio
async def test_all_31_uuids_deleted():
    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 uid in DELETED_UUIDS:
                res = await session.call_tool("mem0_delete", {"memory_id": uid})
                # Should return error since ID was already deleted
                assert "not found" in res.content[0].text.lower() or "error" in res.content[0].text.lower()

@pytest.mark.asyncio
async def test_legacy_dscons_search_zero_matches():
    async with sse_client("http://127.0.0.1:8765/sse") as (read, write):
        async with ClientSession(read, write) as session:
            await session.initialize()
            res = await session.call_tool("mem0_search", {"query": "DSCons", "limit": 10})
            data = json.loads(res.content[0].text)
            results = data.get("memories", {}).get("results", [])
            for r in results:
                # None of the results should contain obsolete project dump keywords
                text = r.get("memory", "").lower()
                assert "cống hộp" not in text
                assert "bến kem" not in text
                assert "kiến minh" not in text
                assert "gdt_captcha" not in text

@pytest.mark.asyncio
async def test_preservation_of_developer_preferences():
    async with sse_client("http://127.0.0.1:8765/sse") as (read, write):
        async with ClientSession(read, write) as session:
            await session.initialize()
            res = await session.call_tool("mem0_search", {"query": "Developer prefers Python and TypeScript", "limit": 5})
            data = json.loads(res.content[0].text)
            results = data.get("memories", {}).get("results", [])
            assert len(results) > 0
            matching = [r for r in results if "typescript" in r.get("memory", "").lower() and "python" in r.get("memory", "").lower()]
            assert len(matching) > 0

@pytest.mark.asyncio
async def test_preservation_of_volamweb_rules():
    async with sse_client("http://127.0.0.1:8765/sse") as (read, write):
        async with ClientSession(read, write) as session:
            await session.initialize()
            res = await session.call_tool("mem0_search", {"query": "strict 0 VND budget Google Cloud", "limit": 3})
            data = json.loads(res.content[0].text)
            results = data.get("memories", {}).get("results", [])
            assert len(results) > 0
            matching = [r for r in results if "0 vnd budget" in r.get("memory", "").lower()]
            assert len(matching) > 0
