Feature: OpenRouter provider support in ProviderRegistry
  As a developer using CleverAgents
  I want ProviderRegistry to handle ProviderType.OPENROUTER in create_llm and _create_provider_llm
  So that OpenRouter models are accessible without raising ValueError

  # Covers the core acceptance criterion:
  # ProviderRegistry.create_llm handles ProviderType.OPENROUTER without raising ValueError

  @unit @providers @openrouter @registry
  Scenario: create_llm dispatches to OpenRouter via _create_provider_llm
    Given I have an openrouter registry with API key "sk-or-test-key"
    And the openrouter registry LangChain ChatOpenAI client is stubbed
    When I call create_llm on the openrouter registry for provider "openrouter" with model "anthropic/claude-3-haiku"
    Then the openrouter registry ChatOpenAI should be called with model "anthropic/claude-3-haiku"
    And the openrouter registry ChatOpenAI should use base url "https://openrouter.ai/api/v1"
    And the openrouter registry ChatOpenAI should use api key "sk-or-test-key"

  @unit @providers @openrouter @registry
  Scenario: _create_provider_llm builds ChatOpenAI for OpenRouter with default model
    Given I have an openrouter registry with API key "sk-or-default"
    And the openrouter registry LangChain ChatOpenAI client is stubbed
    When I call _create_provider_llm on the openrouter registry for provider "openrouter" with model None
    Then the openrouter registry ChatOpenAI should be called with model "anthropic/claude-sonnet-4-20250514"
    And the openrouter registry ChatOpenAI should use base url "https://openrouter.ai/api/v1"

  @unit @providers @openrouter @registry
  Scenario: _create_provider_llm injects organization headers when configured
    Given I have an openrouter registry with API key "sk-or-org" and organization "myapp.example.com"
    And the openrouter registry LangChain ChatOpenAI client is stubbed
    When I call _create_provider_llm on the openrouter registry for provider "openrouter" with model "openai/gpt-4o"
    Then the openrouter registry ChatOpenAI should include header "HTTP-Referer" with value "myapp.example.com"
    And the openrouter registry ChatOpenAI should include header "X-Title" with value "myapp.example.com"

  @unit @providers @openrouter @registry
  Scenario: _create_provider_llm passes custom default_headers through
    Given I have an openrouter registry with API key "sk-or-headers"
    And the openrouter registry LangChain ChatOpenAI client is stubbed
    When I call _create_provider_llm on the openrouter registry for provider "openrouter" with model "openai/gpt-4o" and default_headers "X-Custom=trace-123"
    Then the openrouter registry ChatOpenAI should include header "X-Custom" with value "trace-123"

  @unit @providers @openrouter @registry
  Scenario: create_llm raises ValueError when OpenRouter API key is missing
    Given I have an openrouter registry with no API keys
    When I try to call create_llm on the openrouter registry for provider "openrouter"
    Then an openrouter registry ValueError should be raised
    And the openrouter registry error should mention "OPENROUTER_API_KEY"

  @unit @providers @openrouter @registry
  Scenario: ProviderType.OPENROUTER is in the registry fallback order
    Given I have the openrouter ProviderRegistry class
    When I check the openrouter FALLBACK_ORDER
    Then ProviderType.OPENROUTER should be in the fallback order

  @unit @providers @openrouter @registry
  Scenario: OpenRouter default model is configured correctly
    Given I have the openrouter ProviderRegistry class
    When I check the openrouter DEFAULT_MODELS
    Then the openrouter default model should be "anthropic/claude-sonnet-4-20250514"

  @unit @providers @openrouter @registry
  Scenario: OpenRouter capabilities are configured correctly
    Given I have the openrouter ProviderRegistry class
    When I check the openrouter DEFAULT_CAPABILITIES for OPENROUTER
    Then the openrouter provider supports_streaming should be True
    And the openrouter provider supports_tool_calls should be True
    And the openrouter provider supports_vision should be True
    And the openrouter provider max_context_length should be 128000
    And the openrouter provider supports_json_mode should be True

  @unit @providers @openrouter @registry
  Scenario: OpenRouter provider is discovered when API key is set
    Given I have an openrouter registry with API key "sk-or-discover"
    When I call get_provider_info for OPENROUTER on the openrouter registry
    Then the openrouter provider info should be configured

  @unit @providers @openrouter @registry
  Scenario: OpenRouter provider is not discovered when API key is missing
    Given I have an openrouter registry with no API keys
    When I call get_provider_info for OPENROUTER on the openrouter registry
    Then the openrouter provider info should not be configured

  @unit @providers @openrouter @registry
  Scenario: create_llm selects OpenRouter as default when it is the only configured provider
    Given I have an openrouter registry with API key "sk-or-only"
    And the openrouter registry LangChain ChatOpenAI client is stubbed
    When I call create_llm on the openrouter registry without specifying a provider
    Then the openrouter registry ChatOpenAI should be called with model "anthropic/claude-sonnet-4-20250514"
