"""
Api module for the cards app.
"""
from rest_framework import status
from rest_framework.response import Response
from rest_framework.viewsets import ModelViewSet
from rest_framework.decorators import action

from utils.api import AdminDeleteMixin

from .models import Card
from .serializers import CardSerializer
from .serializers import CardRankingSerializer


class CardViewSet(AdminDeleteMixin, ModelViewSet):
    """
    Card view set.
    """

    queryset = Card.objects.all()
    serializer_class = CardSerializer

    @action(detail=True, methods=["post"])
    def rank(self, request, pk=None):  # pylint: disable=C0103,W0613
        """
        Rank card.
        """
        card = self.get_object()

        rank = CardRankingSerializer(data=request.data)

        if rank.is_valid():
            user = request.user if request.user.is_authenticated else None
            rank.save(user=user, card=card)
            return Response(status=status.HTTP_201_CREATED)

        return Response(
            status=status.HTTP_406_NOT_ACCEPTABLE,
            data=rank.errors,
        )
