"""Tests for turnstone.core.memory — database operations."""

import sqlalchemy as sa

from turnstone.core.memory import (
    normalize_key,
    save_message,
    search_history,
    search_history_recent,
)
from turnstone.core.storage import get_storage


class TestSchemaCreation:
    def test_creates_tables(self, tmp_db):
        engine = get_storage()._engine  # noqa: SLF001
        with engine.connect() as conn:
            rows = conn.execute(
                sa.text(
                    "SELECT name FROM sqlite_master "
                    "WHERE type='table' AND name='structured_memories'"
                )
            ).fetchall()
            assert len(rows) == 1
            rows = conn.execute(
                sa.text(
                    "SELECT name FROM sqlite_master WHERE type='table' AND name='conversations'"
                )
            ).fetchall()
            assert len(rows) == 1


class TestSaveAndSearchHistory:
    def test_save_and_search_roundtrip(self, tmp_db):
        save_message("sess1", "user", "hello world test message")
        results = search_history("hello")
        assert len(results) >= 1
        found = any(r[3] == "hello world test message" for r in results)
        assert found

    def test_search_empty_query_returns_empty(self, tmp_db):
        save_message("sess1", "user", "something")
        assert search_history("") == []
        assert search_history("   ") == []

    def test_search_no_match(self, tmp_db):
        save_message("sess1", "user", "hello world")
        results = search_history("zzzznotfound")
        assert results == []


class TestSearchHistoryRecent:
    def test_returns_recent_messages(self, tmp_db):
        save_message("sess1", "user", "first message")
        save_message("sess1", "assistant", "second message")
        results = search_history_recent(limit=10)
        assert len(results) == 2

    def test_respects_limit(self, tmp_db):
        for i in range(5):
            save_message("sess1", "user", f"message {i}")
        results = search_history_recent(limit=3)
        assert len(results) == 3


class TestNormalizeKey:
    def test_lowercase(self):
        assert normalize_key("Hello") == "hello"

    def test_hyphens_to_underscores(self):
        assert normalize_key("my-key") == "my_key"

    def test_spaces_to_underscores(self):
        assert normalize_key("my key") == "my_key"

    def test_combined(self):
        assert normalize_key("My-Key Name") == "my_key_name"

    def test_already_normalized(self):
        assert normalize_key("my_key") == "my_key"
