"""Provider factory + sentiment fallback behavior."""
import os

from app.services.market_data import MockMarketDataProvider, get_provider
from app.agents.sentiment import SentimentAgent


def test_factory_defaults_to_mock(monkeypatch):
    monkeypatch.delenv("DATA_PROVIDER", raising=False)
    assert isinstance(get_provider(), MockMarketDataProvider)


def test_factory_live_without_keys_falls_back(monkeypatch):
    monkeypatch.setenv("DATA_PROVIDER", "live")
    for k in ("ALPACA_API_KEY", "ALPACA_API_SECRET", "TRADIER_API_TOKEN"):
        monkeypatch.delenv(k, raising=False)
    assert isinstance(get_provider(), MockMarketDataProvider)


def test_factory_live_with_keys(monkeypatch):
    monkeypatch.setenv("DATA_PROVIDER", "live")
    monkeypatch.setenv("ALPACA_API_KEY", "test")
    monkeypatch.setenv("ALPACA_API_SECRET", "test")
    from app.services.live_data import LiveMarketDataProvider

    assert isinstance(get_provider(), LiveMarketDataProvider)


def test_live_provider_history_falls_back_to_mock_without_keys(monkeypatch):
    for k in ("ALPACA_API_KEY", "ALPACA_API_SECRET", "TRADIER_API_TOKEN"):
        monkeypatch.delenv(k, raising=False)
    from app.services.live_data import LiveMarketDataProvider

    provider = LiveMarketDataProvider()
    bars = provider.get_history("TSLA")
    assert len(bars) > 30  # mock fallback produced data
    chain = provider.get_options_chain("TSLA")
    assert len(chain) > 0


def test_sentiment_mock_mode_without_llm_keys(monkeypatch):
    for k in ("ANTHROPIC_API_KEY", "OPENAI_API_KEY"):
        monkeypatch.delenv(k, raising=False)
    provider = MockMarketDataProvider()
    result = SentimentAgent().run({
        "symbol": "TSLA",
        "history": provider.get_history("TSLA"),
        "quote": provider.get_quote("TSLA"),
    })
    assert result.data["source"] == "mock"
    assert 0 <= result.score <= 100
