from rest_framework import generics, status
from rest_framework.permissions import IsAuthenticated
from rest_framework.response import Response
from rest_framework.views import APIView
from rest_framework_simplejwt.tokens import RefreshToken
from .models import Usuario
from .serializers import CadastroSerializer, EditarPerfilSerializer, TrocarSenhaSerializer

class CadastroView(generics.CreateAPIView):
    queryset = Usuario.objects.all()
    serializer_class = CadastroSerializer

class LogoutView(APIView):
    permission_classes = [IsAuthenticated]

    def post(self, request):
        try:
            refresh_token = request.data['refresh_token']
            token = RefreshToken(refresh_token)
            token.blacklist()
            return Response({'mensagem': 'Logout realizado com sucesso.'}, status=status.HTTP_205_RESET_CONTENT)
        except Exception:
            return Response({'mensagem': 'Token inválido.'}, status=status.HTTP_400_BAD_REQUEST)

class PerfilView(APIView):
    permission_classes = [IsAuthenticated]

    def get(self, request):
        avatar = request.user.avatar.url if request.user.avatar else None

        return Response({
            'id': request.user.id,
            'avatar': avatar,
            'first_name': request.user.first_name,
            'last_name': request.user.last_name,
            'email': request.user.email,
            'bio': request.user.bio,
            'date_joined': request.user.date_joined,
            'last_login': request.user.last_login,
            'is_escritor': request.user.is_escritor,
            'is_leitor_especial': request.user.is_leitor_especial,
        })

class EditarPerfilView(generics.UpdateAPIView):
    permission_classes = [IsAuthenticated]
    queryset = Usuario.objects.all()
    serializer_class = EditarPerfilSerializer
    lookup_field = 'id'

    def get_object(self):
        return self.request.user

class TrocarSenhaView(APIView):         
    permission_classes = [IsAuthenticated]
    queryset = Usuario.objects.all()
    serializer_class = TrocarSenhaSerializer
    lookup_field = 'id'

    def get_object(self):
        return self.request.user

    def put(self, request, *args, **kwargs):
        instance = self.get_object()
        serializer = TrocarSenhaSerializer(
            instance=instance,
            data=request.data,
            context={'request': request},
        )
        serializer.is_valid(raise_exception=True)
        serializer.save()
        return Response({'mensagem': 'Senha alterada com sucesso.'}, status=status.HTTP_200_OK)
