from rest_framework.response import Response
from rest_framework import status
from rest_framework.permissions import AllowAny
from rest_framework.generics import GenericAPIView
from apps.users.models import User
from apps.users.serializers.password_reset import (
    PasswordResetRequestSerializer, 
    PasswordResetConfirmSerializer
)
from apps.core.services import send_email_otp

class PasswordResetRequestView(GenericAPIView): 
    authentication_classes = [] 
    permission_classes = [AllowAny]
    throttle_scope = 'password_reset_request'
    serializer_class = PasswordResetRequestSerializer 

    def post(self, request, *args, **kwargs):  
        serializer = self.get_serializer(data=request.data)
        serializer.is_valid(raise_exception=True)
        
        email = serializer.validated_data['email']
        user = User.objects.get(email=email)
        
        # OTP send kora hochche (Directly using user and email)
        send_email_otp(user, email)
        
        return Response({
            "success": True,
            "message": "OTP sent to your email"
        }, status=status.HTTP_200_OK)

class PasswordResetConfirmView(GenericAPIView):
    authentication_classes = [] 
    permission_classes = [AllowAny]
    throttle_scope = 'password_reset_confirm'
    serializer_class = PasswordResetConfirmSerializer 

    def post(self, request, *args, **kwargs):
        serializer = self.get_serializer(data=request.data)
        serializer.is_valid(raise_exception=True)
        
        # Serializer validate method theke user object-ti nicchi
        user = serializer.validated_data['user']
        new_password = serializer.validated_data['new_password']
        
        # Password set ebong security fields update
        user.set_password(new_password)
        user.otp = None
        user.otp_expires_at = None
        user.is_active = True
        user.is_email_verified = True  
        user.save()
        
        return Response({
            "success": True,
            "message": "Password reset successful. You can now login."
        }, status=status.HTTP_200_OK)