import os
import sys

import pytest
from dotenv import load_dotenv
from fastapi import Request
from fastapi.routing import APIRoute

import litellm
from litellm.proxy._types import SpendCalculateRequest
from litellm.proxy.spend_tracking.spend_management_endpoints import calculate_spend
from litellm.router import Router

# this file is to test litellm/proxy

sys.path.insert(
    0, os.path.abspath("../..")
)  # Adds the parent directory to the system path


@pytest.mark.asyncio
async def test_spend_calc_model_messages():
    cost_obj = await calculate_spend(
        request=SpendCalculateRequest(
            model="gpt-3.5-turbo",
            messages=[
                {"role": "user", "content": "What is the capital of France?"},
            ],
        )
    )

    print("calculated cost", cost_obj)
    cost = cost_obj["cost"]
    assert cost > 0.0


@pytest.mark.asyncio
async def test_spend_calc_model_on_router_messages():
    from litellm.proxy.proxy_server import llm_router as init_llm_router

    temp_llm_router = Router(
        model_list=[
            {
                "model_name": "special-llama-model",
                "litellm_params": {
                    "model": "groq/llama-3.1-8b-instant",
                },
            }
        ]
    )

    setattr(litellm.proxy.proxy_server, "llm_router", temp_llm_router)

    cost_obj = await calculate_spend(
        request=SpendCalculateRequest(
            model="special-llama-model",
            messages=[
                {"role": "user", "content": "What is the capital of France?"},
            ],
        )
    )

    print("calculated cost", cost_obj)
    _cost = cost_obj["cost"]

    assert _cost > 0.0

    # set router to init value
    setattr(litellm.proxy.proxy_server, "llm_router", init_llm_router)


@pytest.mark.asyncio
async def test_spend_calc_using_response():
    cost_obj = await calculate_spend(
        request=SpendCalculateRequest(
            completion_response={
                "id": "chatcmpl-3bc7abcd-f70b-48ab-a16c-dfba0b286c86",
                "choices": [
                    {
                        "finish_reason": "stop",
                        "index": 0,
                        "message": {
                            "content": "Yooo! What's good?",
                            "role": "assistant",
                        },
                    }
                ],
                "created": "1677652288",
                "model": "groq/llama-3.1-8b-instant",
                "object": "chat.completion",
                "system_fingerprint": "fp_873a560973",
                "usage": {
                    "completion_tokens": 8,
                    "prompt_tokens": 12,
                    "total_tokens": 20,
                },
            }
        )
    )

    print("calculated cost", cost_obj)
    cost = cost_obj["cost"]
    assert cost > 0.0


@pytest.mark.asyncio
async def test_spend_calc_model_alias_on_router_messages():
    from litellm.proxy.proxy_server import llm_router as init_llm_router

    temp_llm_router = Router(
        model_list=[
            {
                "model_name": "gpt-4o",
                "litellm_params": {
                    "model": "gpt-4o",
                },
            }
        ],
        model_group_alias={
            "gpt4o": "gpt-4o",
        },
    )

    setattr(litellm.proxy.proxy_server, "llm_router", temp_llm_router)

    cost_obj = await calculate_spend(
        request=SpendCalculateRequest(
            model="gpt4o",
            messages=[
                {"role": "user", "content": "What is the capital of France?"},
            ],
        )
    )

    print("calculated cost", cost_obj)
    _cost = cost_obj["cost"]

    assert _cost > 0.0

    # set router to init value
    setattr(litellm.proxy.proxy_server, "llm_router", init_llm_router)
