import pytest
from ra_aid.tool_configs import (
    get_read_only_tools,
    get_research_tools,
    get_planning_tools,
    get_implementation_tools,
    get_web_research_tools
)

def test_get_read_only_tools():
    # Test without human interaction
    tools = get_read_only_tools(human_interaction=False)
    assert len(tools) > 0
    assert all(callable(tool) for tool in tools)
    
    # Test with human interaction
    tools_with_human = get_read_only_tools(human_interaction=True)
    assert len(tools_with_human) == len(tools) + 1

def test_get_research_tools():
    # Test basic research tools
    tools = get_research_tools()
    assert len(tools) > 0
    assert all(callable(tool) for tool in tools)
    
    # Test without expert
    tools_no_expert = get_research_tools(expert_enabled=False)
    assert len(tools_no_expert) < len(tools)
    
    # Test research-only mode
    tools_research_only = get_research_tools(research_only=True)
    assert len(tools_research_only) < len(tools)

def test_get_planning_tools():
    # Test with expert enabled
    tools = get_planning_tools(expert_enabled=True)
    assert len(tools) > 0
    assert all(callable(tool) for tool in tools)
    
    # Test without expert
    tools_no_expert = get_planning_tools(expert_enabled=False)
    assert len(tools_no_expert) < len(tools)

def test_get_implementation_tools():
    # Test with expert enabled
    tools = get_implementation_tools(expert_enabled=True)
    assert len(tools) > 0
    assert all(callable(tool) for tool in tools)
    
    # Test without expert
    tools_no_expert = get_implementation_tools(expert_enabled=False)
    assert len(tools_no_expert) < len(tools)

def test_get_web_research_tools():
    # Test with expert enabled
    tools = get_web_research_tools(expert_enabled=True)
    assert len(tools) == 4
    assert all(callable(tool) for tool in tools)
    
    # Get tool names and verify exact matches
    tool_names = [tool.name for tool in tools]
    expected_names = ['emit_expert_context', 'ask_expert', 'web_search_tavily', 'emit_research_notes']
    assert sorted(tool_names) == sorted(expected_names)
    
    # Test without expert enabled
    tools_no_expert = get_web_research_tools(expert_enabled=False)
    assert len(tools_no_expert) == 2
    assert all(callable(tool) for tool in tools_no_expert)
    
    # Verify exact tool names when expert is disabled
    tool_names_no_expert = [tool.name for tool in tools_no_expert]
    assert sorted(tool_names_no_expert) == sorted(['web_search_tavily', 'emit_research_notes'])
