# import re
# from rest_framework import status
# from rest_framework.request import Request
# from rest_framework.response import Response
# from rest_framework.exceptions import ValidationError
# from rest_framework.permissions import AllowAny, IsAuthenticated
# from rest_framework.decorators import api_view, permission_classes
# from vet247.serializers import UpdateVet247ProfileSerializer, Vet247Serializer
# # from .notifications import send_sms

# from base.exceptions import UnprocessableEntity

# from user.helpers import creat_tokens, verify_token

# from customer.models import Customer
# from customer.serializers import BigCustomerSerializer, CustomerSerializer, UpdateCustomerSerializer

# from supplier.serializers import SupplierSerializer, UpdateSupplierSerializer

# from doctor.serializers import DoctorSerializer, UpdateDoctorProfileSerializer

# from .models import PendingUser, Role, User
# from .serializers import UserSerializer

# import random

# def is_valid_phone_number(phone_number):
#     pattern = r'^(0|1)\d{9,10}$'
    
#     if re.match(pattern, phone_number):
#         return True
#     else:
#         return False
    

# @api_view(['POST'])
# @permission_classes([AllowAny])
# def registration(request: Request) -> Response:
#     phone = request.data.get('phone')
#     role = request.data.get('role')

#     if not phone:
#         raise ValidationError(
#             detail='phone and password is required', code=status.HTTP_400_BAD_REQUEST)

#     try:
#         User.objects.get(phone=phone)
#         raise UnprocessableEntity(
#             detail='phone already exists', code=status.HTTP_406_NOT_ACCEPTABLE)
#     except User.DoesNotExist:
#         user = User()
#         user.phone = phone
#         # user.set_password(raw_password=password)
#         user.is_staff = request.data.get('is_staff', False)
#         user.is_superuser = request.data.get('is_superuser', False)

#         if role:
#             role_name = Role.objects.get(name=role)
#             user.role = role_name
#             user.save()
#         else:
#             customer_role = Role.objects.get(name='Customer')
#             user.role = customer_role
#             user.save()

#             Customer.objects.create(user=user)

#         return Response(UserSerializer(user).data, status=status.HTTP_201_CREATED)

# # user login

# @api_view(['POST'])
# @permission_classes([AllowAny])
# def login(request: Request) -> Response:
#     phone = request.data.get('phone')
#     password = request.data.get('password')

#     if not phone or not password:
#         raise ValidationError(
#             detail='phone and password is required', code=status.HTTP_400_BAD_REQUEST)
#     try:
#         user = User.objects.get(phone__exact=phone)
#         if not user.check_password(raw_password=password):
#             raise ValidationError(detail='invalid password',
#                                   code=status.HTTP_400_BAD_REQUEST)
#         access_token = creat_tokens(user=user)
#         data = {
#             'access_token': access_token,
#         }
#         return Response(data=data, status=status.HTTP_201_CREATED)
#     except User.DoesNotExist:
#         raise ValidationError(detail='user not found',
#                               code=status.HTTP_404_NOT_FOUND)

# # user info
# @api_view(['GET'])
# @permission_classes([IsAuthenticated])
# def get_user_info(request: Request) -> Response:
#     user = request.user

#     if hasattr(user, 'doctor'):
#         serializer = DoctorSerializer(user.doctor)    
#     elif hasattr(user, 'vet247'):
#         serializer = Vet247Serializer(user.vet247)
#     elif hasattr(user, 'supplier'):
#         serializer = SupplierSerializer(user.supplier)
#     elif hasattr(user, 'customer'):
#         serializer = BigCustomerSerializer(user.customer)
#     else:
#         serializer = UserSerializer(user)

#     return Response(serializer.data, status=status.HTTP_200_OK)



# @api_view(['PATCH'])
# @permission_classes([IsAuthenticated])
# def update_user_info(request):
#     user = request.user
#     if request.method == 'PATCH':
#         if hasattr(user, 'doctor'):
#             serializer = UpdateDoctorProfileSerializer(user.doctor, data=request.data, partial=True)       
#         elif hasattr(user, 'vet247'):
#             serializer = UpdateVet247ProfileSerializer(user.vet247, data=request.data, partial=True)
#         elif hasattr(user, 'supplier'):
#             serializer = UpdateSupplierSerializer(user.supplier, data=request.data, partial=True)
#         elif hasattr(user, 'customer'):
#             serializer = UpdateCustomerSerializer(user.customer, data=request.data, partial=True)
#         else:
#             serializer = UserSerializer(user, data=request.data, partial=True)

#         if serializer.is_valid():
#             serializer.save()
#             return Response(serializer.data, status=status.HTTP_200_OK)
#         return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

#     if hasattr(user, 'doctor'):
#         serializer = DoctorSerializer(user.doctor)    
#     elif hasattr(user, 'vet247'):
#         serializer = Vet247Serializer(user.vet247)
#     elif hasattr(user, 'supplier'):
#         serializer = SupplierSerializer(user.supplier)
#     elif hasattr(user, 'customer'):
#         serializer = CustomerSerializer(user.customer)
#     else:
#         serializer = UserSerializer(user)

#     return Response(serializer.data, status=status.HTTP_200_OK)


# @api_view(['POST'])
# @permission_classes([AllowAny])
# def SendMobileOTP(request: Request) -> Response:
#     phone = request.data.get('phone')
#     company_name = 'Nexo Pet'
#     otp_code = ''.join(random.choice('0123456789') for i in range(5))

#     if not phone:
#         raise ValidationError(
#             detail='phone and password is required', code=status.HTTP_400_BAD_REQUEST)
    
#     if not is_valid_phone_number(phone):
#         raise ValidationError(detail='Phone Number is Invalid', code=status.HTTP_400_BAD_REQUEST)

#     try:
#         user = User.objects.get(phone=phone)
#         if user:
#             # send_sms(phone,f"Your {company_name} OTP code is {otp_code}",otp_code)
#             pending_user, created = PendingUser.objects.get_or_create(phone=phone)
#             pending_user.phone = phone
#             pending_user.verification_code = otp_code
#             pending_user.save()
#             return Response({"success": True, "message": "OTP sent for verification!"}, status=200)
#     except User.DoesNotExist:
#         user = User()
#         user.phone = phone
#         user.is_staff = request.data.get('is_staff', False)
#         user.is_superuser = request.data.get('is_superuser', False)
#         user.save()
#         customer_role = Role.objects.get(name='Customer')
#         user.role = customer_role
#         user.save()
#         customer=Customer.objects.create(user=user)
#         customer.save()
#         if user:
#             # send_sms(phone,f"Your {company_name} OTP code is {otp_code}",otp_code)
#             pending_user, created = PendingUser.objects.get_or_create(phone=phone)
#             pending_user.verification_code=otp_code
#             pending_user.phone
#             pending_user.save()
#             return Response({"success": True, "message": "OTP sent for verification!"}, status=200)
#     return Response({"success": False, "message": "Something Went Wrong or already verified"}, status=200)


# # Verify OTP API endpoint
# @api_view(['POST'])
# @permission_classes([AllowAny])
# def VerifyMobileOTP(request):
#     phone = request.data.get('phone')
#     otp = request.data.get('otp')

#     if not phone or not otp:
#         raise ValidationError(detail='Phone and OTP are required', code=status.HTTP_400_BAD_REQUEST)
#     if not is_valid_phone_number(phone):
#         raise ValidationError(detail='Phone Number is Invalid', code=status.HTTP_400_BAD_REQUEST)
#     try:
#         pending_user = PendingUser.objects.get(phone=phone)
#         if str(otp) == pending_user.verification_code:
#             user = User.objects.get(phone=phone)
#             pending_user.delete()
#             access_token = creat_tokens(user=user)
#             data = {
#             'access_token': access_token,
#             'message' : 'OTP verified',
#             'success' : True
#             }
#             user.is_verified = True
#             user.save()
#             return Response(data=data, status=status.HTTP_200_OK)
#         else:
#             return Response({'detail': 'Invalid OTP'}, status=status.HTTP_400_BAD_REQUEST)
#     except PendingUser.DoesNotExist:
#         return Response({'detail': 'Phone number not found or OTP has expired, Please request a new one.'}, status=status.HTTP_400_BAD_REQUEST)
    

# # Test Verify OTP API endpoint
# @api_view(['POST'])
# @permission_classes([AllowAny])
# def TestVerifyMobileOTP(request):
#     phone = request.data.get('phone')
#     otp = request.data.get('otp')

#     if not phone or not otp:
#         raise ValidationError(detail='Phone and OTP are required', code=status.HTTP_400_BAD_REQUEST)
#     if not is_valid_phone_number(phone):
#         raise ValidationError(detail='Phone Number is Invalid', code=status.HTTP_400_BAD_REQUEST)
#     try:
#         pending_user = PendingUser.objects.get(phone=phone)
#         if phone in ["01674047351","01705317153","01940720053"] and otp == "87654":
#             user = User.objects.get(phone=phone)
#             access_token = creat_tokens(user=user)
#             data = {
#             'access_token': access_token,
#             'message' : 'OTP verified',
#             'success' : True
#             }
#             user.is_verified = True
#             user.save()
#             return Response(data=data, status=status.HTTP_200_OK)
#         elif str(otp) == pending_user.verification_code:
#             user = User.objects.get(phone=phone)
#             pending_user.delete()
#             access_token = creat_tokens(user=user)
#             data = {
#             'access_token': access_token,
#             'message' : 'OTP verified',
#             'success' : True
#             }
#             user.is_verified = True
#             user.save()
#             return Response(data=data, status=status.HTTP_200_OK)
#         else:
#             return Response({'detail': 'Invalid OTP'}, status=status.HTTP_400_BAD_REQUEST)
#     except PendingUser.DoesNotExist:
#         return Response({'detail': 'Phone number not found or OTP has expired, Please request a new one.'}, status=status.HTTP_400_BAD_REQUEST)
    

# @api_view(['GET'])
# @permission_classes([IsAuthenticated])
# def logout(request):
#     user = request.user
#     user.is_verified = False
#     user.save()
#     return Response({'detail': 'Logged out'}, status=status.HTTP_200_OK)


# @api_view(['POST'])
# @permission_classes([AllowAny])
# def verify_jwt_token(request):
#     token = request.data.get('token')
#     if not token:
#         return Response({'detail': 'Token not provided'}, status=status.HTTP_400_BAD_REQUEST)
#     user = verify_token(token)
#     if user is None:
#         return Response({'detail': 'Invalid or expired token'}, status=status.HTTP_401_UNAUTHORIZED)
#     return Response({'user_id': user.id, 'username': user.phone, 'role':user.role.name}, status=status.HTTP_200_OK)
