from rest_framework_simplejwt.views import TokenObtainPairView
from rest_framework_simplejwt.serializers import TokenObtainPairSerializer
from rest_framework.response import Response
from rest_framework import status
from rest_framework import generics
from rest_framework.permissions import IsAuthenticated

from .serializers import UserProfileSerializer, CustomTokenObtainPairSerializer, UserSerializer
from .models import CustomUser


# Vista para obtener el perfil del usuario
class UserProfileView(generics.RetrieveAPIView):
    permission_classes = [IsAuthenticated]
    serializer_class = UserProfileSerializer

    def get_object(self):
        return self.request.user


# Vista personalizada para el login JWT con cookie HttpOnly
class CustomTokenObtainPairView(TokenObtainPairView):
    serializer_class = CustomTokenObtainPairSerializer

    def post(self, request, *args, **kwargs):
        print(" Datos recibidos del frontend:", request.data)

        email = request.data.get("username")
        password = request.data.get("password")

        if not email or not password:
            print(" Email o contraseña no proporcionados.")
            return Response({"detail": "Email y contraseña son requeridos."}, status=status.HTTP_400_BAD_REQUEST)

        try:
            response = super().post(request, *args, **kwargs)
            refresh = response.data.get("refresh")
            access = response.data.get("access")

            if not refresh or not access:
                print(" No se generó refresh o access token.")
                return Response({"detail": "No se pudo autenticar."}, status=status.HTTP_401_UNAUTHORIZED)

            print(" Token generado correctamente:")
            print(" access:", access)
            print(" refresh:", refresh)

            res = Response({"access": access})  # Solo mandamos access token al frontend
            res.set_cookie(
                key="refreshToken",
                value=refresh,
                httponly=True,
                secure=False,  # ️ Solo para desarrollo. En producción: True
                samesite="Lax",
            )
            return res
        except Exception as e:
            print(" Error generando el token:", str(e))
            return Response({"detail": "Error al autenticar."}, status=status.HTTP_401_UNAUTHORIZED)
        


class TecnicosListView(generics.ListAPIView):
    serializer_class = UserSerializer
    pagination_class = None

    def get_queryset(self):
        return CustomUser.objects.filter(tipo_usuario='tecnico')
