"""Tests for deerflow.config.tracing_config."""

from __future__ import annotations

import pytest

from deerflow.config import tracing_config as tracing_module
from deerflow.config.tracing_config import reset_tracing_config


def _reset_tracing_cache() -> None:
    reset_tracing_config()


@pytest.fixture(autouse=True)
def clear_tracing_env(monkeypatch):
    for name in (
        "LANGSMITH_TRACING",
        "LANGCHAIN_TRACING_V2",
        "LANGCHAIN_TRACING",
        "LANGSMITH_API_KEY",
        "LANGCHAIN_API_KEY",
        "LANGSMITH_PROJECT",
        "LANGCHAIN_PROJECT",
        "LANGSMITH_ENDPOINT",
        "LANGCHAIN_ENDPOINT",
        "LANGFUSE_TRACING",
        "LANGFUSE_PUBLIC_KEY",
        "LANGFUSE_SECRET_KEY",
        "LANGFUSE_BASE_URL",
    ):
        monkeypatch.delenv(name, raising=False)
    _reset_tracing_cache()
    yield
    _reset_tracing_cache()


def test_prefers_langsmith_env_names(monkeypatch):
    monkeypatch.setenv("LANGSMITH_TRACING", "true")
    monkeypatch.setenv("LANGSMITH_API_KEY", "lsv2_key")
    monkeypatch.setenv("LANGSMITH_PROJECT", "smith-project")
    monkeypatch.setenv("LANGSMITH_ENDPOINT", "https://smith.example.com")

    _reset_tracing_cache()
    cfg = tracing_module.get_tracing_config()

    assert cfg.langsmith.enabled is True
    assert cfg.langsmith.api_key == "lsv2_key"
    assert cfg.langsmith.project == "smith-project"
    assert cfg.langsmith.endpoint == "https://smith.example.com"
    assert tracing_module.is_tracing_enabled() is True
    assert tracing_module.get_enabled_tracing_providers() == ["langsmith"]


def test_falls_back_to_langchain_env_names(monkeypatch):
    monkeypatch.delenv("LANGSMITH_TRACING", raising=False)
    monkeypatch.delenv("LANGSMITH_API_KEY", raising=False)
    monkeypatch.delenv("LANGSMITH_PROJECT", raising=False)
    monkeypatch.delenv("LANGSMITH_ENDPOINT", raising=False)

    monkeypatch.setenv("LANGCHAIN_TRACING_V2", "true")
    monkeypatch.setenv("LANGCHAIN_API_KEY", "legacy-key")
    monkeypatch.setenv("LANGCHAIN_PROJECT", "legacy-project")
    monkeypatch.setenv("LANGCHAIN_ENDPOINT", "https://legacy.example.com")

    _reset_tracing_cache()
    cfg = tracing_module.get_tracing_config()

    assert cfg.langsmith.enabled is True
    assert cfg.langsmith.api_key == "legacy-key"
    assert cfg.langsmith.project == "legacy-project"
    assert cfg.langsmith.endpoint == "https://legacy.example.com"
    assert tracing_module.is_tracing_enabled() is True
    assert tracing_module.get_enabled_tracing_providers() == ["langsmith"]


def test_langsmith_tracing_false_overrides_langchain_tracing_v2_true(monkeypatch):
    """LANGSMITH_TRACING=false must win over LANGCHAIN_TRACING_V2=true."""
    monkeypatch.setenv("LANGSMITH_TRACING", "false")
    monkeypatch.setenv("LANGCHAIN_TRACING_V2", "true")
    monkeypatch.setenv("LANGSMITH_API_KEY", "some-key")

    _reset_tracing_cache()
    cfg = tracing_module.get_tracing_config()

    assert cfg.langsmith.enabled is False
    assert tracing_module.is_tracing_enabled() is False
    assert tracing_module.get_enabled_tracing_providers() == []


def test_defaults_when_project_not_set(monkeypatch):
    monkeypatch.setenv("LANGSMITH_TRACING", "yes")
    monkeypatch.setenv("LANGSMITH_API_KEY", "key")
    monkeypatch.delenv("LANGSMITH_PROJECT", raising=False)
    monkeypatch.delenv("LANGCHAIN_PROJECT", raising=False)

    _reset_tracing_cache()
    cfg = tracing_module.get_tracing_config()

    assert cfg.langsmith.project == "deer-flow"


def test_langfuse_config_is_loaded(monkeypatch):
    monkeypatch.setenv("LANGFUSE_TRACING", "true")
    monkeypatch.setenv("LANGFUSE_PUBLIC_KEY", "pk-lf-test")
    monkeypatch.setenv("LANGFUSE_SECRET_KEY", "sk-lf-test")
    monkeypatch.setenv("LANGFUSE_BASE_URL", "https://langfuse.example.com")

    _reset_tracing_cache()
    cfg = tracing_module.get_tracing_config()

    assert cfg.langfuse.enabled is True
    assert cfg.langfuse.public_key == "pk-lf-test"
    assert cfg.langfuse.secret_key == "sk-lf-test"
    assert cfg.langfuse.host == "https://langfuse.example.com"
    assert tracing_module.get_enabled_tracing_providers() == ["langfuse"]


def test_dual_provider_config_is_loaded(monkeypatch):
    monkeypatch.setenv("LANGSMITH_TRACING", "true")
    monkeypatch.setenv("LANGSMITH_API_KEY", "lsv2_key")
    monkeypatch.setenv("LANGFUSE_TRACING", "true")
    monkeypatch.setenv("LANGFUSE_PUBLIC_KEY", "pk-lf-test")
    monkeypatch.setenv("LANGFUSE_SECRET_KEY", "sk-lf-test")

    _reset_tracing_cache()
    cfg = tracing_module.get_tracing_config()

    assert cfg.langsmith.is_configured is True
    assert cfg.langfuse.is_configured is True
    assert tracing_module.is_tracing_enabled() is True
    assert tracing_module.get_enabled_tracing_providers() == ["langsmith", "langfuse"]


def test_langfuse_enabled_requires_public_and_secret_keys(monkeypatch):
    monkeypatch.setenv("LANGFUSE_TRACING", "true")
    monkeypatch.delenv("LANGFUSE_PUBLIC_KEY", raising=False)
    monkeypatch.setenv("LANGFUSE_SECRET_KEY", "sk-lf-test")

    _reset_tracing_cache()

    assert tracing_module.get_tracing_config().is_configured is False
    assert tracing_module.get_enabled_tracing_providers() == []
    assert tracing_module.get_tracing_config().explicitly_enabled_providers == ["langfuse"]

    with pytest.raises(ValueError, match="LANGFUSE_PUBLIC_KEY"):
        tracing_module.validate_enabled_tracing_providers()
