import pytest

from openhands.agenthub.browsing_agent.response_parser import (
    BrowseInteractiveAction,
    BrowsingResponseParser,
)


@pytest.mark.parametrize(
    'action_str, expected',
    [
        ("click('81'", "click('81')```"),
        (
            '"We need to search the internet\n```goto("google.com")',
            '"We need to search the internet\n```goto("google.com")```',
        ),
        ("```click('81'", "```click('81')```"),
        ("click('81')", "click('81')```"),
        (
            "send_msg_to_user('The server might not be running or accessible. Please check the server status and try again.')",
            "send_msg_to_user('The server might not be running or accessible. Please check the server status and try again.')```",
        ),
    ],
)
def test_parse_response(action_str: str, expected: str) -> None:
    # BrowsingResponseParser.parse_response
    parser = BrowsingResponseParser()
    response = {'choices': [{'message': {'content': action_str}}]}
    result = parser.parse_response(response)
    assert result == expected


@pytest.mark.parametrize(
    'action_str, expected_browser_actions, expected_thought, expected_msg_content',
    [
        ("click('81')```", "click('81')", '', ''),
        ("```click('81')```", "click('81')", '', ''),
        (
            "We need to perform a click\n```click('81')",
            "click('81')",
            'We need to perform a click',
            '',
        ),
        (
            'Tell the user that the city was built in 1751.\n```send_msg_to_user("Based on the results of my search, the city was built in 1751.")',
            'send_msg_to_user("Based on the results of my search, the city was built in 1751.")',
            'Tell the user that the city was built in 1751.',
            'Based on the results of my search, the city was built in 1751.',
        ),
        (
            'Tell the user that the city was built in 1751.\n```send_msg_to_user("Based on the results of my search, the city was built in 1751.")```',
            'send_msg_to_user("Based on the results of my search, the city was built in 1751.")',
            'Tell the user that the city was built in 1751.',
            'Based on the results of my search, the city was built in 1751.',
        ),
        (
            "Tell the user that the city was built in 1751.\n```send_msg_to_user('Based on the results of my search, the city was built in 1751.')```",
            "send_msg_to_user('Based on the results of my search, the city was built in 1751.')",
            'Tell the user that the city was built in 1751.',
            'Based on the results of my search, the city was built in 1751.',
        ),
        (
            "send_msg_to_user('The server might not be running or accessible. Please check the server status and try again.'))```",
            "send_msg_to_user('The server might not be running or accessible. Please check the server status and try again.'))",
            '',
            'The server might not be running or accessible. Please check the server status and try again.',
        ),
    ],
)
def test_parse_action(
    action_str: str,
    expected_browser_actions: str,
    expected_thought: str,
    expected_msg_content: str,
) -> None:
    # BrowsingResponseParser.parse_action
    parser = BrowsingResponseParser()
    action = parser.parse_action(action_str)
    assert isinstance(action, BrowseInteractiveAction)
    assert action.browser_actions == expected_browser_actions
    assert action.thought == expected_thought
    assert action.browsergym_send_msg_to_user == expected_msg_content
