"""Tests for config modules (Settings and ConfigRegistry)."""

from crystallise.config.settings import Settings
from crystallise.config.registry import ConfigRegistry, ServiceConfig


class TestSettings:
    def test_loads_with_defaults(self):
        settings = Settings()
        assert settings.default_model == "gpt-5-nano"
        assert settings.clustering_model == "gpt-4.1"
        assert settings.max_concurrent_requests == 10
        assert settings.default_repetitions == 5
        assert settings.default_threshold == 1.0
        assert settings.api_port == 8005

    def test_openai_key_type_is_string(self):
        settings = Settings()
        assert isinstance(settings.openai_api_key, str)

    def test_database_url_type_is_string(self):
        settings = Settings()
        assert isinstance(settings.database_url, str)


class TestConfigRegistry:
    def test_returns_default_configs(self):
        registry = ConfigRegistry()
        configs = registry.list_configs()
        assert len(configs) > 0
        service_ids = [c.service_id for c in configs]
        assert "screening" in service_ids
        assert "extraction" in service_ids

    def test_get_config_known_service(self):
        registry = ConfigRegistry()
        config = registry.get_config("screening")
        assert isinstance(config, ServiceConfig)
        assert config.service_id == "screening"
        assert isinstance(config.model, str)
        assert len(config.model) > 0
        assert config.max_output_tokens == 8192

    def test_get_config_unknown_service_returns_default(self):
        registry = ConfigRegistry()
        config = registry.get_config("nonexistent")
        assert config.service_id == "nonexistent"
        assert config.model == "gpt-5-nano"

    def test_update_config_updates_model(self):
        registry = ConfigRegistry()
        updated = registry.update_config("screening", {"model": "gpt-4.1"})
        assert updated.model == "gpt-4.1"
        # Verify persisted
        assert registry.get_config("screening").model == "gpt-4.1"

    def test_update_config_extra_fields(self):
        registry = ConfigRegistry()
        updated = registry.update_config("screening", {"custom_param": "value"})
        assert updated.extra["custom_param"] == "value"

    def test_list_configs_returns_all(self):
        registry = ConfigRegistry()
        configs = registry.list_configs()
        service_ids = {c.service_id for c in configs}
        expected = {"screening", "screening.clustering", "extraction", "indexer", "criteria", "deduplication"}
        assert expected == service_ids
