# tests/platform/test_mock.py
from sdk.mock import MockPlatformClient
from sdk.interface import User, MessageResponse, UserSettings
from core.protocol import SettingsAction


async def test_get_or_create_user_returns_user():
    client = MockPlatformClient()
    user = await client.get_or_create_user("12345", "telegram", "Иван")
    assert isinstance(user, User)
    assert user.external_id == "12345"
    assert user.platform == "telegram"
    assert user.is_new is True


async def test_get_or_create_user_idempotent():
    client = MockPlatformClient()
    u1 = await client.get_or_create_user("42", "matrix")
    u2 = await client.get_or_create_user("42", "matrix")
    assert u1.user_id == u2.user_id
    assert u2.is_new is False


async def test_send_message_returns_response():
    client = MockPlatformClient()
    user = await client.get_or_create_user("u1", "telegram")
    result = await client.send_message(user.user_id, "C1", "Привет!")
    assert isinstance(result, MessageResponse)
    assert result.finished is True
    assert len(result.response) > 0


async def test_get_settings_returns_defaults():
    client = MockPlatformClient()
    settings = await client.get_settings("usr-telegram-42")
    assert isinstance(settings, UserSettings)
    assert "web-search" in settings.skills


async def test_update_settings_toggle_skill():
    client = MockPlatformClient()
    action = SettingsAction(action="toggle_skill", payload={"skill": "browser", "enabled": True})
    await client.update_settings("usr-1", action)
    settings = await client.get_settings("usr-1")
    assert settings.skills.get("browser") is True


async def test_update_settings_toggle_skill_preserves_other_skills():
    client = MockPlatformClient()

    initial = await client.get_settings("usr-1")
    initial_skill_names = set(initial.skills)

    action = SettingsAction(action="toggle_skill", payload={"skill": "browser", "enabled": True})
    await client.update_settings("usr-1", action)

    settings = await client.get_settings("usr-1")

    assert set(settings.skills) == initial_skill_names
    assert settings.skills["browser"] is True
    assert settings.skills["web-search"] is True
