from fastapi import APIRouter, HTTPException, status
from utils.rwkv import AbstractRWKV
import global_var

router = APIRouter()


@router.get("/dashboard/billing/credit_grants", tags=["MISC"])
def credit_grants():
    return {
        "object": "credit_summary",
        "total_granted": 10000,
        "total_used": 0,
        "total_available": 10000,
        "grants": {
            "object": "list",
            "data": [
                {
                    "object": "credit_grant",
                    "grant_amount": 10000,
                    "used_amount": 0,
                    "effective_at": 1672531200,
                    "expires_at": 33229440000,
                }
            ],
        },
    }


fake_models = [
    {
        "id": "gpt-3.5-turbo",
        "object": "model",
        "created": 1677610602,
        "owned_by": "openai",
        "permission": [
            {
                "id": "modelperm-zy5TOjnE2zVaicIcKO9bQDgX",
                "object": "model_permission",
                "created": 1690864883,
                "allow_create_engine": False,
                "allow_sampling": True,
                "allow_logprobs": True,
                "allow_search_indices": False,
                "allow_view": True,
                "allow_fine_tuning": False,
                "organization": "*",
                "group": None,
                "is_blocking": False,
            }
        ],
        "root": "gpt-3.5-turbo",
        "parent": None,
    },
    {
        "id": "text-davinci-003",
        "object": "model",
        "created": 1669599635,
        "owned_by": "openai-internal",
        "permission": [
            {
                "id": "modelperm-a6niqBmW2JaGmo0fDO7FEt1n",
                "object": "model_permission",
                "created": 1690930172,
                "allow_create_engine": False,
                "allow_sampling": True,
                "allow_logprobs": True,
                "allow_search_indices": False,
                "allow_view": True,
                "allow_fine_tuning": False,
                "organization": "*",
                "group": None,
                "is_blocking": False,
            }
        ],
        "root": "text-davinci-003",
        "parent": None,
    },
]


@router.get("/v1/models", tags=["MISC"])
@router.get("/models", tags=["MISC"])
def models():
    model: AbstractRWKV = global_var.get(global_var.Model)
    model_name = model.name if model else "rwkv"

    return {
        "object": "list",
        "data": [
            {
                "id": model_name,
                "object": "model",
                "owned_by": "rwkv",
                "root": model_name,
                "parent": None,
            },
            *fake_models,
        ],
    }


@router.get("/v1/models/{model_id}", tags=["MISC"])
@router.get("/models/{model_id}", tags=["MISC"])
def model(model_id: str):
    for fake_model in fake_models:
        if fake_model["id"] == model_id:
            return fake_model

    if "rwkv" in model_id.lower():
        model: AbstractRWKV = global_var.get(global_var.Model)
        model_name = model.name if model else "rwkv"
        return {
            "id": model_name,
            "object": "model",
            "owned_by": "rwkv",
            "root": model_name,
            "parent": None,
        }

    raise HTTPException(
        status.HTTP_404_NOT_FOUND,
        {
            "error": {
                "message": f"The model '{model_id}' does not exist",
                "type": "invalid_request_error",
                "param": "model",
                "code": "model_not_found",
            }
        },
    )