"""Tests for configuration loader."""

import os
from pathlib import Path

import pytest

from src.config.config_loader import get_config, load_config
from src.core.exceptions import ConfigurationError


def test_load_config_success(temp_config_dir, monkeypatch):
    """Test successful config loading."""
    from src.core import constants
    original_path = constants.PATHS["config"]
    constants.PATHS["config"] = temp_config_dir
    
    config = load_config()
    assert config is not None
    assert "app" in config
    assert config["app"]["name"] == "Test App"
    
    constants.PATHS["config"] = original_path


def test_load_config_missing_file(temp_dir, monkeypatch):
    """Test config loading with missing file."""
    from src.core import constants
    original_path = constants.PATHS["config"]
    constants.PATHS["config"] = temp_dir / "nonexistent"
    
    with pytest.raises(ConfigurationError):
        load_config()
    
    constants.PATHS["config"] = original_path


def test_get_config_with_key(temp_config_dir, monkeypatch):
    """Test getting config value by key."""
    from src.core import constants
    original_path = constants.PATHS["config"]
    constants.PATHS["config"] = temp_config_dir
    
    value = get_config("app.name")
    assert value == "Test App"
    
    constants.PATHS["config"] = original_path


def test_get_config_with_default(temp_config_dir, monkeypatch):
    """Test getting config with default value."""
    from src.core import constants
    original_path = constants.PATHS["config"]
    constants.PATHS["config"] = temp_config_dir
    
    value = get_config("nonexistent.key", default="default_value")
    assert value == "default_value"
    
    constants.PATHS["config"] = original_path


def test_get_config_none(temp_config_dir, monkeypatch):
    """Test getting entire config."""
    from src.core import constants
    original_path = constants.PATHS["config"]
    constants.PATHS["config"] = temp_config_dir
    
    config = get_config()
    assert isinstance(config, dict)
    assert "app" in config
    
    constants.PATHS["config"] = original_path


def test_env_var_substitution(temp_config_dir, monkeypatch):
    """Test environment variable substitution in config."""
    from src.core import constants
    original_path = constants.PATHS["config"]
    constants.PATHS["config"] = temp_config_dir
    
    # Set environment variable
    os.environ["TEST_VAR"] = "test_value"
    
    # Create config with env var
    config_file = temp_config_dir / "config.yaml"
    config_file.write_text(
        """
app:
  name: "${TEST_VAR}"
  version: "0.1.0"
"""
    )
    
    # Reset config cache
    import src.config.config_loader as config_module
    config_module._config = None
    
    config = load_config()
    assert config["app"]["name"] == "test_value"
    
    # Cleanup
    del os.environ["TEST_VAR"]
    constants.PATHS["config"] = original_path

