from unittest.mock import MagicMock

import pytest

from crewai import Agent, Task
from crewai.tools.agent_tools.base_agent_tools import BaseAgentTool


class InternalAgentTool(BaseAgentTool):
    """Concrete implementation of BaseAgentTool for testing."""

    def _run(self, *args, **kwargs):
        """Implement required _run method."""
        return "Test response"


@pytest.mark.parametrize(
    "role_name,should_match",
    [
        ("Futel Official Infopoint", True),  # exact match
        ('  "Futel Official Infopoint"  ', True),  # extra quotes and spaces
        ("Futel Official Infopoint\n", True),  # trailing newline
        ('"Futel Official Infopoint"', True),  # embedded quotes
        (" FUTEL\nOFFICIAL   INFOPOINT ", True),  # multiple whitespace and newline
        ("futel official infopoint", True),  # lowercase
        ("FUTEL OFFICIAL INFOPOINT", True),  # uppercase
        ("Non Existent Agent", False),  # non-existent agent
        (None, False),  # None agent name
    ],
)
def test_agent_tool_role_matching(role_name, should_match):
    """Test that agent tools can match roles regardless of case, whitespace, and special characters."""
    # Create test agent
    test_agent = Agent(
        role="Futel Official Infopoint",
        goal="Answer questions about Futel",
        backstory="Futel Football Club info",
        allow_delegation=False,
    )

    # Create test agent tool
    agent_tool = InternalAgentTool(
        name="test_tool", description="Test tool", agents=[test_agent]
    )

    # Test role matching
    result = agent_tool._execute(agent_name=role_name, task="Test task", context=None)

    if should_match:
        assert (
            "coworker mentioned not found" not in result.lower()
        ), f"Should find agent with role name: {role_name}"
    else:
        assert (
            "coworker mentioned not found" in result.lower()
        ), f"Should not find agent with role name: {role_name}"
