import json
import os

from unittest.mock import patch

import pytest

from litellm import completion
from litellm.llms.custom_httpx.http_handler import HTTPHandler


@patch.dict(os.environ, {}, clear=True)
def test_completion_datarobot():
    """Ensure that the completion function works with DataRobot API."""
    messages = [
        {"role": "user", "content": "What's the weather like in San Francisco?"}
    ]
    try:
        client = HTTPHandler()
        with patch.object(client, "post") as mock_post:
            response = completion(
                model="datarobot/vertex_ai/gemini-1.5-flash-002",
                messages=messages,
                client=client,
                max_tokens=5,
                clientId="custom-model",
            )
            print(response)

            # Add any assertions here to check the response
            mock_post.assert_called_once()
            mocks_kwargs = mock_post.call_args.kwargs
            assert (
                mocks_kwargs["url"]
                == "https://app.datarobot.com/api/v2/genai/llmgw/chat/completions/"
            )
            assert mocks_kwargs["headers"]["Authorization"] == "Bearer fake-api-key"
            json_data = json.loads(mock_post.call_args.kwargs["data"])
            assert json_data["clientId"] == "custom-model"
    except Exception as e:
        pytest.fail(f"Error occurred: {e}")


@patch.dict(
    os.environ,
    {
        "DATAROBOT_ENDPOINT": "https://app.datarobot.com/api/v2/deployments/deployment_id/"
    },
    clear=True,
)
def test_completion_datarobot_with_deployment():
    """Ensure that deployment URL is used correctly."""
    messages = [
        {"role": "user", "content": "What's the weather like in San Francisco?"}
    ]
    try:
        client = HTTPHandler()
        with patch.object(client, "post") as mock_post:
            response = completion(
                model="datarobot/vertex_ai/gemini-1.5-flash-002",
                messages=messages,
                client=client,
                max_tokens=5,
                clientId="custom-model",
            )
            print(response)

            # Add any assertions here to check the response
            mock_post.assert_called_once()
            mocks_kwargs = mock_post.call_args.kwargs
            assert (
                mocks_kwargs["url"]
                == "https://app.datarobot.com/api/v2/deployments/deployment_id/"
            )
            assert mocks_kwargs["headers"]["Authorization"] == "Bearer fake-api-key"
            json_data = json.loads(mock_post.call_args.kwargs["data"])
            assert json_data["clientId"] == "custom-model"
    except Exception as e:
        pytest.fail(f"Error occurred: {e}")


def test_completion_datarobot_with_environment_variables():
    """Allow the test to run with environment variables if they are set for integrations."""
    # If keys are not set, the test will be skipped
    if os.environ.get("DATAROBOT_API_TOKEN") is None:
        return

    messages = [
        {"role": "user", "content": "What's the weather like in San Francisco?"}
    ]
    try:
        response = completion(
            model="datarobot/vertex_ai/gemini-1.5-flash-002",
            messages=messages,
            max_tokens=5,
            clientId="custom-model",
        )
        print(response)
        assert response["object"] == "chat.completion"
        assert response["model"] == "gemini-1.5-flash-002"
        assert len(response["choices"]) == 1
        assert len(response["choices"][0]["message"]["content"]) > 0
    except Exception as e:
        pytest.fail(f"Error occurred: {e}")
