"""Tests for SnapshotSettingsContext in local_deep_research.settings.manager."""

from unittest.mock import patch


from local_deep_research.settings.manager import SnapshotSettingsContext


class TestSnapshotSettingsContext:
    # ------------------------------------------------------------------
    # 1. Plain scalar values are returned as-is
    # ------------------------------------------------------------------
    def test_plain_values(self):
        ctx = SnapshotSettingsContext(snapshot={"key": "val"})
        assert ctx.get_setting("key") == "val"

    # ------------------------------------------------------------------
    # 2. Dict objects with "value" key are unwrapped
    # ------------------------------------------------------------------
    def test_unwrap_value_objects(self):
        snapshot = {"key": {"value": "val", "ui_element": "text"}}
        ctx = SnapshotSettingsContext(snapshot=snapshot)
        assert ctx.get_setting("key") == "val"

    # ------------------------------------------------------------------
    # 3. Missing key returns the supplied default
    # ------------------------------------------------------------------
    def test_missing_key_returns_default(self):
        ctx = SnapshotSettingsContext(snapshot={})
        assert ctx.get_setting("absent", "fallback") == "fallback"

    # ------------------------------------------------------------------
    # 4. Missing key logs at DEBUG level by default
    # ------------------------------------------------------------------
    def test_missing_key_logs_at_default_debug_level(self):
        ctx = SnapshotSettingsContext(snapshot={})
        with patch(
            "local_deep_research.settings.manager.logger"
        ) as mock_logger:
            ctx.get_setting("absent", "fallback")
            mock_logger.log.assert_called_once()
            call_args = mock_logger.log.call_args
            assert call_args[0][0] == "DEBUG"

    # ------------------------------------------------------------------
    # 5. Missing key logs at WARNING level when configured
    # ------------------------------------------------------------------
    def test_missing_key_logs_at_warning_level(self):
        ctx = SnapshotSettingsContext(
            snapshot={}, missing_key_log_level="WARNING"
        )
        with patch(
            "local_deep_research.settings.manager.logger"
        ) as mock_logger:
            ctx.get_setting("absent")
            mock_logger.log.assert_called_once()
            call_args = mock_logger.log.call_args
            assert call_args[0][0] == "WARNING"

    # ------------------------------------------------------------------
    # 6. username attribute is accessible and defaults to None
    # ------------------------------------------------------------------
    def test_username_stored(self):
        ctx_default = SnapshotSettingsContext(snapshot={})
        assert ctx_default.username is None

        ctx_with_user = SnapshotSettingsContext(snapshot={}, username="alice")
        assert ctx_with_user.username == "alice"

    # ------------------------------------------------------------------
    # 7. Passing None snapshot results in empty .values, no crash
    # ------------------------------------------------------------------
    def test_none_snapshot(self):
        ctx = SnapshotSettingsContext(snapshot=None)
        assert ctx.values == {}
        assert ctx.get_setting("anything", "default") == "default"

    # ------------------------------------------------------------------
    # 8. .snapshot stores the original dict unchanged
    # ------------------------------------------------------------------
    def test_snapshot_attribute_preserved(self):
        original = {"key": {"value": "val", "ui_element": "text"}}
        ctx = SnapshotSettingsContext(snapshot=original)
        assert ctx.snapshot is original
