from rest_framework.views import APIView
from rest_framework.generics import GenericAPIView
from rest_framework.response import Response
from rest_framework import status, permissions
from rest_framework_simplejwt.tokens import RefreshToken
from rest_framework_simplejwt.views import TokenObtainPairView

from .serializers import SignUpSerializer, RoleTokenObtainPairSerializer


class LandingView(APIView):
    permission_classes = [permissions.AllowAny]

    def get(self, request):
        return Response({
            "options": [
                {"name": "signin/signup", "signup": "/api/auth/signup/", "login": "/api/auth/login/"},
                {"name": "explore_hotels", "url": "/api/hotels/"},
                {"name": "explore_restaurants", "url": "/api/restaurants/"},
            ]
        })
# Random Backchodi

class SignupView(GenericAPIView):
    permission_classes = [permissions.AllowAny]
    serializer_class = SignUpSerializer

    def post(self, request):
        serializer = self.get_serializer(data=request.data)
        serializer.is_valid(raise_exception=True)

        user = serializer.save()
        from users.models import create_user_session
        session = create_user_session(user, request)
        refresh = RefreshToken.for_user(user)
        refresh['session_key'] = str(session.session_key)
        refresh.access_token['session_key'] = str(session.session_key)

        return Response({
            "user": {
                "id": user.id,
                "username": user.username,
                "email": user.email,
                "role": user.role,
            },
            "access": str(refresh.access_token),
            "refresh": str(refresh),
        }, status=status.HTTP_201_CREATED)


class RoleLoginView(TokenObtainPairView):
    serializer_class = RoleTokenObtainPairSerializer
