"""Tests for MCP Settings."""

import pytest
from pydantic import ValidationError

from arcade_mcp_server.settings import MCPSettings, ServerSettings


class TestServerSettings:
    """Test ServerSettings class."""

    def test_server_settings_defaults(self):
        """Test ServerSettings default values."""
        settings = ServerSettings()

        assert settings.name == "ArcadeMCP"
        assert settings.version == "0.1.0"
        assert settings.title == "ArcadeMCP"
        assert settings.instructions is not None
        assert "available tools" in settings.instructions.lower()

    def test_server_settings_custom_values(self):
        """Test ServerSettings with custom values."""
        settings = ServerSettings(
            name="CustomServer",
            version="2.0.0",
            title="Custom Title",
            instructions="Custom instructions",
        )

        assert settings.name == "CustomServer"
        assert settings.version == "2.0.0"
        assert settings.title == "Custom Title"
        assert settings.instructions == "Custom instructions"

    def test_server_settings_partial_values(self):
        """Test ServerSettings with partial custom values."""
        settings = ServerSettings(
            name="PartialServer",
            version="1.5.0",
        )

        assert settings.name == "PartialServer"
        assert settings.version == "1.5.0"
        assert settings.title == "ArcadeMCP"  # Default value
        assert settings.instructions is not None  # Default value


class TestMCPSettings:
    """Test MCPSettings class."""

    def test_mcp_settings_defaults(self):
        """Test MCPSettings default values."""
        settings = MCPSettings()

        assert settings.server.name == "ArcadeMCP"
        assert settings.server.version == "0.1.0"
        assert settings.server.title == "ArcadeMCP"
        assert settings.server.instructions is not None

    def test_mcp_settings_with_custom_server(self):
        """Test MCPSettings with custom ServerSettings."""
        server_settings = ServerSettings(
            name="TestServer",
            version="3.0.0",
            title="Test Title",
            instructions="Test instructions",
        )
        settings = MCPSettings(server=server_settings)

        assert settings.server.name == "TestServer"
        assert settings.server.version == "3.0.0"
        assert settings.server.title == "Test Title"
        assert settings.server.instructions == "Test instructions"

    def test_mcp_settings_from_env(self, monkeypatch):
        """Test MCPSettings.from_env() uses environment variables."""
        monkeypatch.setenv("MCP_SERVER_NAME", "EnvServer")
        monkeypatch.setenv("MCP_SERVER_VERSION", "4.0.0")
        monkeypatch.setenv("MCP_SERVER_TITLE", "Env Title")
        monkeypatch.setenv("MCP_SERVER_INSTRUCTIONS", "Env instructions")

        settings = MCPSettings.from_env()

        assert settings.server.name == "EnvServer"
        assert settings.server.version == "4.0.0"
        assert settings.server.title == "Env Title"
        assert settings.server.instructions == "Env instructions"


class TestServerSettingsTitleDefault:
    """Test that the default title value is 'ArcadeMCP'."""

    def test_title_default_value(self):
        """Test that the default title value is 'ArcadeMCP'."""
        settings = ServerSettings()
        assert settings.title == "ArcadeMCP"

    def test_title_field_default(self):
        """Test that the title field default is 'ArcadeMCP'."""
        field_info = ServerSettings.model_fields["title"]
        assert field_info.default == "ArcadeMCP"


class TestServerSettingsVersionValidation:
    """Tests for ServerSettings version validation (semver enforcement)."""

    def test_server_settings_rejects_invalid_version(self) -> None:
        """Test ServerSettings raises ValidationError for invalid version."""
        with pytest.raises(ValidationError, match="semver"):
            ServerSettings(version="bad")

    def test_server_settings_accepts_valid_semver(self) -> None:
        """Test ServerSettings accepts valid semver."""
        settings = ServerSettings(version="1.2.3-alpha.1+build.456")
        assert settings.version == "1.2.3-alpha.1+build.456"

    def test_server_settings_normalizes_short_version(self) -> None:
        """Test ServerSettings normalizes MAJOR.MINOR to MAJOR.MINOR.0."""
        settings = ServerSettings(version="1.0")
        assert settings.version == "1.0.0"

    def test_server_settings_normalizes_v_prefix(self) -> None:
        """Test ServerSettings strips v prefix and normalizes the version."""
        settings = ServerSettings(version="v1.0.0")
        assert settings.version == "1.0.0"

    def test_server_settings_normalizes_v_prefix_short(self) -> None:
        """Test ServerSettings strips v prefix from short versions."""
        settings = ServerSettings(version="v1.0")
        assert settings.version == "1.0.0"

    def test_server_settings_normalizes_major_only(self) -> None:
        """Test ServerSettings normalizes MAJOR to MAJOR.0.0."""
        settings = ServerSettings(version="1")
        assert settings.version == "1.0.0"

    def test_server_settings_normalizes_v_major_only(self) -> None:
        """Test ServerSettings strips v prefix from major-only versions."""
        settings = ServerSettings(version="v1")
        assert settings.version == "1.0.0"

    def test_mcp_settings_env_rejects_invalid_version(self, monkeypatch: pytest.MonkeyPatch) -> None:
        """Test MCP_SERVER_VERSION env var is validated."""
        monkeypatch.setenv("MCP_SERVER_VERSION", "not-valid")
        with pytest.raises(ValidationError, match="semver"):
            MCPSettings.from_env()
