"""Unit tests for session URI parsing support."""

import pytest

from fs.agfs_adapter.agfs_context_fs import parse_uri, uri_to_path


class TestParseSessionUri:
    """Tests for parse_uri function with session archive patterns."""

    def test_parse_session_archive_uri(self):
        """Test parsing a session archive URI (Pattern 6)."""
        uri = "ctx://acme/sessions/session-123/history/archive-456"
        result = parse_uri(uri)
        assert result == {
            'account': 'acme',
            'owner_type': 'sessions',
            'owner_id': 'session-123',
            'category': 'history',
            'slug': 'archive-456',
        }

    def test_parse_session_history_directory_uri(self):
        """Test parsing a session history directory URI (Pattern 7)."""
        uri = "ctx://acme/sessions/session-123/history"
        result = parse_uri(uri)
        assert result == {
            'account': 'acme',
            'owner_type': 'sessions',
            'owner_id': 'session-123',
            'category': 'history',
            'slug': '',
        }

    def test_parse_session_history_directory_uri_with_trailing_slash(self):
        """Test parsing session history directory URI with trailing slash."""
        uri = "ctx://acme/sessions/session-123/history/"
        result = parse_uri(uri)
        assert result == {
            'account': 'acme',
            'owner_type': 'sessions',
            'owner_id': 'session-123',
            'category': 'history',
            'slug': '',
        }

    def test_parse_session_archive_with_complex_ids(self):
        """Test parsing session archive with UUID-like IDs."""
        uri = "ctx://mycorp/sessions/abc-123-def-456/history/2025-04-03T10:30:00Z"
        result = parse_uri(uri)
        assert result == {
            'account': 'mycorp',
            'owner_type': 'sessions',
            'owner_id': 'abc-123-def-456',
            'category': 'history',
            'slug': '2025-04-03T10:30:00Z',
        }

    def test_parse_invalid_uri_still_raises(self):
        """Test that invalid URI format still raises ValueError."""
        with pytest.raises(ValueError, match="Invalid URI format"):
            parse_uri("not-a-valid-uri")

        with pytest.raises(ValueError, match="Invalid URI format"):
            parse_uri("http://example.com/path")


class TestSessionUriToPath:
    """Tests for uri_to_path function with session archive patterns."""

    def test_session_archive_uri_to_path(self):
        """Test session archive URI to path mapping (Pattern 6)."""
        uri = "ctx://acme/sessions/session-123/history/archive-456"
        path = uri_to_path(uri)
        assert path == "/accounts/acme/sessions/session-123/history/archive-456/"

    def test_session_history_directory_uri_to_path(self):
        """Test session history directory URI to path mapping (Pattern 7)."""
        uri = "ctx://acme/sessions/session-123/history"
        path = uri_to_path(uri)
        assert path == "/accounts/acme/sessions/session-123/history/"

    def test_session_history_directory_uri_with_trailing_slash_to_path(self):
        """Test session history directory with trailing slash to path mapping."""
        uri = "ctx://acme/sessions/session-123/history/"
        path = uri_to_path(uri)
        assert path == "/accounts/acme/sessions/session-123/history/"


def test_parse_session_state_uri():
    uri = "ctx://acme/sessions/session-123/state"
    result = parse_uri(uri)
    assert result == {
        "account": "acme",
        "owner_type": "sessions",
        "owner_id": "session-123",
        "category": "state",
        "slug": "state",
    }


def test_session_state_uri_to_path():
    uri = "ctx://acme/sessions/session-123/state"
    path = uri_to_path(uri)
    assert path == "/accounts/acme/sessions/session-123/state/"


def test_parse_session_state_json_uri():
    uri = "ctx://acme/sessions/session-123/state.json"
    result = parse_uri(uri)
    assert result == {
        "account": "acme",
        "owner_type": "sessions",
        "owner_id": "session-123",
        "category": "state",
        "slug": "state",
    }


def test_session_state_json_uri_to_path():
    uri = "ctx://acme/sessions/session-123/state.json"
    path = uri_to_path(uri)
    assert path == "/accounts/acme/sessions/session-123/state.json/"


def test_sql_parse_session_state_uri():
    from fs.sql_adapter.sql_context_fs import parse_uri as sql_parse_uri

    result = sql_parse_uri("ctx://acme/sessions/session-123/state")

    assert result == {
        "account": "acme",
        "owner_type": "sessions",
        "owner_id": "session-123",
        "category": "state",
        "slug": "state",
    }


def test_sql_parse_session_state_json_uri():
    from fs.sql_adapter.sql_context_fs import parse_uri as sql_parse_uri

    result = sql_parse_uri("ctx://acme/sessions/session-123/state.json")

    assert result == {
        "account": "acme",
        "owner_type": "sessions",
        "owner_id": "session-123",
        "category": "state",
        "slug": "state",
    }