"""Site-admin settings: the Anthropic API key and monthly spending cap for Claude reviews."""

from __future__ import annotations

import anthropic
from fastapi import APIRouter, Depends, HTTPException
from psycopg import Connection
from pydantic import BaseModel, Field

from .. import keystore, server_settings
from ..auth import User, current_user
from ..db import get_conn

router = APIRouter(prefix="/admin", tags=["settings"])


def require_site_admin(user: User = Depends(current_user)) -> User:
    if not user.is_admin:
        raise HTTPException(403, "Only site administrators can change server settings")
    return user


class CapIn(BaseModel):
    monthly_cap_usd: float = Field(ge=0, le=10000)


class KeyIn(BaseModel):
    key: str = Field(min_length=20, max_length=300, pattern=r"^sk-ant-[A-Za-z0-9_\-]+$")


def check_key(key: str) -> None:
    """Make a free call (list models) to confirm Anthropic accepts the key."""
    try:
        anthropic.Anthropic(api_key=key, timeout=20.0, max_retries=1).models.list(limit=1)
    except anthropic.AuthenticationError as e:
        raise HTTPException(422, "Anthropic rejected this key. Check it and try again.") from e
    except anthropic.PermissionDeniedError as e:
        raise HTTPException(422, "This key is not allowed to use the API.") from e
    except (anthropic.APIConnectionError, anthropic.APIStatusError) as e:
        raise HTTPException(502, "Could not reach Anthropic to check the key; try again shortly.") from e


@router.get("/ai-key")
def get_ai_key(conn: Connection = Depends(get_conn), user: User = Depends(require_site_admin)):
    return keystore.anthropic_status(conn)


@router.put("/ai-key")
def put_ai_key(body: KeyIn, conn: Connection = Depends(get_conn), user: User = Depends(require_site_admin)):
    if not keystore.ready():
        raise HTTPException(409, "The server has no APP_SECRET_KEY yet, so it cannot store the key safely. See the README.")
    key = body.key.strip()
    check_key(key)
    keystore.put(conn, keystore.ANTHROPIC_KEY, key, user.id)
    return keystore.anthropic_status(conn)


@router.post("/ai-key/test")
def test_ai_key(conn: Connection = Depends(get_conn), user: User = Depends(require_site_admin)):
    key = keystore.anthropic_key(conn)
    if not key:
        raise HTTPException(409, "No API key is set.")
    check_key(key)
    return {"ok": True}


@router.delete("/ai-key")
def delete_ai_key(conn: Connection = Depends(get_conn), user: User = Depends(require_site_admin)):
    keystore.delete(conn, keystore.ANTHROPIC_KEY)
    return keystore.anthropic_status(conn)


@router.get("/ai-cap")
def get_ai_cap(conn: Connection = Depends(get_conn), user: User = Depends(require_site_admin)):
    return server_settings.ai_cap_status(conn)


@router.put("/ai-cap")
def put_ai_cap(body: CapIn, conn: Connection = Depends(get_conn), user: User = Depends(require_site_admin)):
    server_settings.set_ai_cap(conn, body.monthly_cap_usd, user.id)
    return server_settings.ai_cap_status(conn)


@router.delete("/ai-cap")
def reset_ai_cap(conn: Connection = Depends(get_conn), user: User = Depends(require_site_admin)):
    server_settings.reset_ai_cap(conn)
    return server_settings.ai_cap_status(conn)
