from rest_framework.decorators import action
from rest_framework.viewsets import ModelViewSet

from core.permissions import IsAdmin
from core.responses import success_response, error_response

from .models import LLMProvider
from .serializers import LLMProviderSerializer
from .service import call_llm


class LLMProviderViewSet(ModelViewSet):
    """Admin CRUD for LLM providers. /api/v1/llm/providers/ (ADMIN only)."""
    queryset = LLMProvider.objects.all()
    serializer_class = LLMProviderSerializer
    permission_classes = [IsAdmin]

    def list(self, request, *args, **kwargs):
        data = self.get_serializer(self.get_queryset(), many=True).data
        return success_response(data)

    def create(self, request, *args, **kwargs):
        s = self.get_serializer(data=request.data)
        s.is_valid(raise_exception=True)
        s.save()
        return success_response(s.data, "Provider created")

    def update(self, request, *args, **kwargs):
        partial = kwargs.pop("partial", False)
        s = self.get_serializer(self.get_object(), data=request.data, partial=partial)
        s.is_valid(raise_exception=True)
        s.save()
        return success_response(s.data, "Provider updated")

    def destroy(self, request, *args, **kwargs):
        self.get_object().delete()
        return success_response(None, "Provider deleted")

    @action(detail=True, methods=["post"], url_path="test")
    def test(self, request, pk=None):
        """Send a ping prompt to verify the key/model work."""
        provider = self.get_object()
        result = call_llm(
            "Reply with exactly: TA-ATS connection OK",
            provider=provider, purpose="test", user=request.user,
        )
        if result["ok"]:
            return success_response({"reply": result["text"]}, "Provider is working ✓")
        return error_response(f"Test failed: {result['error']}", status_code=400)
