from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status
from .serializer import *
from auth_apis.models import *
import random
from datetime import datetime
from .functions import *
from django.conf import settings
from passlib.hash import django_pbkdf2_sha256 as handler
import json
from admin_panel.models import *


# Create your views here.
def gernateUserId():
    lastObj=Buyer.objects.all().last()
    if lastObj:
        if not lastObj.customer_id:return 'CUS00001'

        theId=lastObj.customer_id
        theId=theId[3:]
        theId=int(theId)+1
        theId=str(theId)
        theId=theId.zfill(5)
        return "CUS"+str(theId)
    else:
        return 'CUS00001'



class login(APIView):
    def post(self,request):
        try:
            serializer = LoginSerializer(data=request.data)
            if serializer.is_valid():
                customerObj=User.objects.filter(isd_code=request.data.get('isd_code'),phone_number=request.data.get('phone_number').lstrip('0')).first()
                theotp=random.randrange(1000, 9999, 5)
                if not customerObj:
                    customerObj=User.objects.create(isd_code=request.data.get('isd_code'),phone_number=request.data.get('phone_number').lstrip('0'),is_buyer=1)
                customerObj.otp_generated=theotp
                customerObj.otp_created_at= datetime.now()
                device_type = request.data.get('device_type')
                if not device_type:
                    return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'device_type is required'})
                device_token = request.data.get('device_token')
                if not device_token:
                    return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'device_token is required'})
                customerObj.device_type = device_type
                customerObj.device_token = device_token
                customerObj.save()
                return Response({'status_code':status.HTTP_200_OK,'status_message':'Success','loginotp':theotp})
            else:
                default_errors = serializer.errors
                new_error = {}
                for field_name, field_errors in default_errors.items():
                    new_error = field_errors
                    break
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':new_error})

        except Exception as e:
            print(e)
            return Response({'status_code':status.HTTP_500_INTERNAL_SERVER_ERROR,'status_message':str(e)},status=status.HTTP_500_INTERNAL_SERVER_ERROR)


class registerPanel(APIView):
    def post(self,request):
        try:
            serializer = RegisterSerializer(data=request.data)
            if serializer.is_valid():
                customerObj=User.objects.filter(isd_code = request.data.get('isd_code'),phone_number = request.data.get('phone_number').lstrip('0'),is_buyer=True,is_otp_verified=True).first()
                if customerObj:
                    return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'This phone number is already registered with us.'})
                customerObjUv=User.objects.filter(isd_code = request.data.get('isd_code'),phone_number = request.data.get('phone_number').lstrip('0'),is_buyer=True,is_otp_verified=False).first()
                if customerObjUv:
                    return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'OTP is not verified.Please verify it again.'})
                isd_code = request.data.get('isd_code')
                phone_number = request.data.get('phone_number').lstrip('0')
                string_password =  request.data.get('password')
                password = handler.hash(string_password)
                theotp=random.randrange(1000, 9999, 5)
                otp_generated=theotp
                customerObj=User.objects.create(password = password,otp_created_at = datetime.now(),isd_code=isd_code,phone_number=phone_number,otp_generated=otp_generated,is_buyer=1)

                return Response({'status_code':status.HTTP_200_OK,'status_message':'Success','loginotp':otp_generated})
            else:
                default_errors = serializer.errors
                new_error = {}
                for field_name, field_errors in default_errors.items():
                    new_error = field_errors
                    break
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':new_error})

        except Exception as e:
            print(e)
            return Response({'status_code':status.HTTP_500_INTERNAL_SERVER_ERROR,'status_message':str(e)},status=status.HTTP_500_INTERNAL_SERVER_ERROR)


class verifyOtpPannel(APIView):
    def post(self,request):
        try:
            serializer = VerifyOtppannelSerializer(data=request.data)
            if serializer.is_valid():
                isd_code = request.data.get('isd_code')
                phone_number = request.data.get('phone_number').lstrip('0')
                enter_otp = request.data.get('otp')
                cust_obj = User.objects.filter(isd_code=isd_code,phone_number=phone_number).first()
                if int(cust_obj.otp_generated) == int(enter_otp):
                    cust_obj.is_otp_verified = True
                    theToken=str(gernateToken())
                    cust_obj.token=theToken
                    cust_obj.save()
                    buyer_obj = Buyer.objects.filter(user_id=cust_obj).first()
                    if not buyer_obj:
                        Buyer.objects.create(user_id=cust_obj.id,customer_id=gernateUserId())
                    allData={'is_buyer':cust_obj.is_buyer,
                            'isd_code':cust_obj.isd_code,
                            'phone':cust_obj.phone_number,
                            'token':cust_obj.token,
                            'is_otp_verified':cust_obj.is_otp_verified,
                            'isProfileComplete':cust_obj.is_profile_completed}
                    return Response({'status_code':status.HTTP_200_OK,'status_message':'Success','data':allData})
                else:
                    return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Invalid otp'})
            else:
                default_errors = serializer.errors
                new_error = {}
                for field_name, field_errors in default_errors.items():
                    new_error = field_errors
                    break
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':new_error})
        except Exception as e:
            print(e)
            return Response({'status_code':status.HTTP_500_INTERNAL_SERVER_ERROR,'status_message':str(e)},status=status.HTTP_500_INTERNAL_SERVER_ERROR)

class resendOtp(APIView):
    def post(self,request):
        isd_code = request.data.get('isd_code')
        if not isd_code:
            return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Isd code is required'})
        phone_number = request.data.get('phone_number').lstrip('0')
        if not phone_number:
            return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Phone number is required'})

        user_obj = User.objects.filter(phone_number =phone_number,isd_code=isd_code,is_buyer=1).first()
        if not user_obj:
            return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Phone number not exist'})
        else:
            theotp=random.randrange(1000, 9999, 5)
            user_obj.otp_generated=theotp
            user_obj.save()
            return Response({'status_code':status.HTTP_200_OK,'status_message':'Otp Send successfully','loginotp':theotp})

class verifyOtp(APIView):
    def post(self,request):
        try:
            serializer = VerifyOtpSerializer(data=request.data)
            if serializer.is_valid():
                customerObj=User.objects.filter(isd_code=request.data.get('isd_code'),phone_number=request.data.get('phone_number').lstrip('0'),otp_generated=request.data.get('otp'),is_buyer=1).first()
                if customerObj:
                    theToken=str(gernateToken())
                    customerObj.token=theToken
                    customerObj.save()
                    buyer_obj = Buyer.objects.filter(user_id=customerObj).first()
                    if not buyer_obj:
                        Buyer.objects.create(user_id=customerObj.id,customer_id=gernateUserId())
                    allData={'is_buyer':customerObj.is_buyer,
                            'isd_code':customerObj.isd_code,
                            'phone':customerObj.phone_number,
                            'token':customerObj.token,
                            'isProfileComplete':customerObj.is_profile_completed}
                    print('all sata==', allData)
                    AdminNotifications.objects.create(message= customerObj.phone_number +' has registered successfully with us.',is_read=True)
                    return Response({'status_code':status.HTTP_200_OK,'status_message':'Success','data':allData})
                else:
                    return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Invalid otp'})
            else:
                default_errors = serializer.errors
                new_error = {}
                for field_name, field_errors in default_errors.items():
                    new_error = field_errors
                    break
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':new_error})
        except Exception as e:
            print(e)
            return Response({'status_code':status.HTTP_500_INTERNAL_SERVER_ERROR,'status_message':str(e)},status=status.HTTP_500_INTERNAL_SERVER_ERROR)

class updateProfile(APIView):
    def get(self,request):
        try:
            session_token=request.META.get('HTTP_AUTHORIZATION')
            if not session_token:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'session_token is required'})
            try:
                user_obj=User.objects.get(token=session_token)
            except Exception as e:
                return Response({'status_code':status.HTTP_401_UNAUTHORIZED,'status_message':'Invalid session token'},status=status.HTTP_401_UNAUTHORIZED)
            buyer_obj =  Buyer.objects.filter(user_id = user_obj.id).first()
            alldata = {
                'email': user_obj.email,
                'isd_code': user_obj.isd_code,
                'phone_number': user_obj.phone_number,
                'avatar':user_obj.avatar,
                'dob': buyer_obj.dob,
                'first_name':buyer_obj.first_name,
                'last_name':buyer_obj.last_name,
                'password':user_obj.password,
                'notification_enabled':user_obj.notification_enabled,
                'is_profile_completed':user_obj.is_profile_completed,
                'wallet_amount':buyer_obj.wallet_amount
            }
            return Response({'status_code':status.HTTP_200_OK,'status_message':'Success','data':alldata})

        except Exception as e:
            print(e)
            return Response({'status_code':status.HTTP_500_INTERNAL_SERVER_ERROR,'status_message':str(e)},status=status.HTTP_500_INTERNAL_SERVER_ERROR)
    def post(self,request):
        try:
            session_token=request.META.get('HTTP_AUTHORIZATION')
            if not session_token:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'session_token is required'})
            try:
                user_obj=User.objects.get(token=session_token)
            except Exception as e:
                return Response({'status_code':status.HTTP_401_UNAUTHORIZED,'status_message':'Invalid session token'},status=status.HTTP_401_UNAUTHORIZED)
            buyer_obj =  Buyer.objects.filter(user_id = user_obj.id).first()
            check_email = User.objects.filter(email=request.data.get('email')).exclude(id=user_obj.id).count()
            if check_email > 0:
                return Response({'status_message':'This email is already registered.'},status=status.HTTP_400_BAD_REQUEST)
            serializer    = UpdateProfileSerializer(data=request.data)
            if serializer.is_valid():
                user_obj.email = request.data.get('email')
                buyer_obj.dob = request.data.get('dob')
                user_obj.isd_code = request.data.get('isd_code')
                user_obj.phone_number = request.data.get('phone_number').lstrip('0')
                buyer_obj.first_name = request.data.get('first_name')
                buyer_obj.last_name = request.data.get('last_name')
                string_password =  request.data.get('password')
                if string_password:
                    password = handler.hash(string_password)
                    user_obj.password = password
                    user_obj.is_profile_completed = True
                if request.data.get('avatar'):
                    fileUrl=uploadTheProfile(request.data.get('avatar'))
                    fileUrl=str(settings.BASE_URL)+'/'+fileUrl
                    user_obj.avatar=str(fileUrl)
                user_obj.save()
                buyer_obj.save()
                allData={'id':user_obj.id,
                        'email':user_obj.email,
                        'dob':buyer_obj.dob,
                        'isd_code':user_obj.isd_code,
                        'phone_number':user_obj.phone_number,
                        'token':user_obj.token,
                        'avatar':user_obj.avatar,
                        'first_name':buyer_obj.first_name,
                        'last_name':buyer_obj.last_name,
                        'password':user_obj.password,
                        'is_profile_completed':user_obj.is_profile_completed,
                        'wallet_amount':buyer_obj.wallet_amount
                    }
                AdminNotifications.objects.create(message= buyer_obj.first_name +' '+ buyer_obj.last_name +' has updated their profile',is_read=True)
                return Response({'status_code':status.HTTP_200_OK,'status_message':'Success','data':allData})
            else:
                default_errors = serializer.errors
                new_error = {}
                for field_name, field_errors in default_errors.items():
                    new_error = field_errors
                    break
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':new_error})
        except Exception as e:
            print(e)
            return Response({'status_code':status.HTTP_500_INTERNAL_SERVER_ERROR,'status_message':str(e)},status=status.HTTP_500_INTERNAL_SERVER_ERROR)


class updateNotificationSettings(APIView):
    def post(self,request):
        try:
            session_token=request.META.get('HTTP_AUTHORIZATION')
            if not session_token:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'session_token is required'})
            try:
                user_obj=User.objects.get(token=session_token)
            except Exception as e:
                return Response({'status_code':status.HTTP_401_UNAUTHORIZED,'status_message':'Invalid session token'},status=status.HTTP_401_UNAUTHORIZED)
            notification_data = request.data.get('notification_data')
            if not notification_data:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Notification data is required'},status=status.HTTP_400_BAD_REQUEST)
            user_obj.notification_enabled = notification_data
            user_obj.save()
            return Response({'status_code':status.HTTP_200_OK,'status_message':'Success','data':notification_data})
        except Exception as e:
            print(e)
            return Response({'status_code':status.HTTP_500_INTERNAL_SERVER_ERROR,'status_message':str(e)},status=status.HTTP_500_INTERNAL_SERVER_ERROR)



class updateProfilePanel(APIView):
    def get(self,request):
        try:
            session_token=request.META.get('HTTP_AUTHORIZATION')
            if not session_token:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'session_token is required'})
            try:
                user_obj=User.objects.get(token=session_token)
            except Exception as e:
                return Response({'status_code':status.HTTP_401_UNAUTHORIZED,'status_message':'Invalid session token'},status=status.HTTP_401_UNAUTHORIZED)
            buyer_obj =  Buyer.objects.filter(user_id = user_obj.id).first()
            alldata = {
                'email': user_obj.email,
                'isd_code': user_obj.isd_code,
                'phone_number': user_obj.phone_number,
                'avatar':user_obj.avatar,
                'dob': buyer_obj.dob,
                'first_name':buyer_obj.first_name,
                'last_name':buyer_obj.last_name,
                'password':user_obj.password,
                'is_profile_completed':user_obj.is_profile_completed,
                'wallet_amount':buyer_obj.wallet_amount
            }
            return Response({'status_code':status.HTTP_200_OK,'status_message':'Success','data':alldata})
        except Exception as e:
            print(e)
            return Response({'status_code':status.HTTP_500_INTERNAL_SERVER_ERROR,'status_message':str(e)},status=status.HTTP_500_INTERNAL_SERVER_ERROR)
    def post(self,request):
        try:
            session_token=request.META.get('HTTP_AUTHORIZATION')
            if not session_token:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'session_token is required'})
            try:
                user_obj=User.objects.get(token=session_token)
            except Exception as e:
                return Response({'status_code':status.HTTP_401_UNAUTHORIZED,'status_message':'Invalid session token'},status=status.HTTP_401_UNAUTHORIZED)
            buyer_obj =  Buyer.objects.filter(user_id = user_obj.id).first()
            serializer    = UpdateProfileSerializer(data=request.data)
            check_email = User.objects.filter(email=request.data.get('email')).exclude(id=user_obj.id).count()
            if check_email > 0:
                return Response({'status_message':'This email is already registered.'},status=status.HTTP_400_BAD_REQUEST)
            if serializer.is_valid():
                user_obj.email = request.data.get('email')
                buyer_obj.dob = request.data.get('dob')
                buyer_obj.first_name = request.data.get('first_name')
                buyer_obj.last_name = request.data.get('last_name')
                user_obj.isd_code = request.data.get('isd_code')
                user_obj.phone_number = request.data.get('phone_number').lstrip('0')
                user_obj.is_profile_completed = True
                if request.data.get('avatar'):
                    fileUrl=uploadTheProfile(request.data.get('avatar'))
                    fileUrl=str(settings.BASE_URL)+'/'+fileUrl
                    user_obj.avatar=str(fileUrl)
                user_obj.save()
                buyer_obj.save()
                allData={'id':user_obj.id,
                        'email':user_obj.email,
                        'dob':buyer_obj.dob,
                        'first_name':buyer_obj.first_name,
                        'last_name':buyer_obj.last_name,
                        'isd_code':user_obj.isd_code,
                        'phone_number':user_obj.phone_number,
                        'token':user_obj.token,
                        'avatar':user_obj.avatar,
                        'password':user_obj.password,
                        'is_profile_completed':user_obj.is_profile_completed,
                        'wallet_amount':buyer_obj.wallet_amount
                    }
                AdminNotifications.objects.create(message= buyer_obj.first_name +''+ buyer_obj.last_name +' has updated their profile',is_read=True)
                return Response({'status_code':status.HTTP_200_OK,'status_message':'Success','data':allData})
            else:
                default_errors = serializer.errors
                new_error = {}
                for field_name, field_errors in default_errors.items():
                    new_error = field_errors
                    break
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':new_error})
        except Exception as e:
            print(e)
            return Response({'status_code':status.HTTP_500_INTERNAL_SERVER_ERROR,'status_message':str(e)},status=status.HTTP_500_INTERNAL_SERVER_ERROR)



class getAddresses(APIView):
    def get(self,request):
        try:
            session_token=request.META.get('HTTP_AUTHORIZATION')
            if not session_token:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'session_token is required'})
            try:
                user_obj=User.objects.get(token=session_token)
            except Exception as e:
                return Response({'status_code':status.HTTP_401_UNAUTHORIZED,'status_message':'Invalid session token'},status=status.HTTP_401_UNAUTHORIZED)
            address_obj =  Addresses.objects.filter(user_id = user_obj.id)
            allData = []
            for i in address_obj:
                alldata = {
                    'id':i.id,
                    'address_label':i.address_label,
                    'name':i.name,
                    'address_line':i.address_line,
                    'country':i.country,
                    'state':i.state,
                    'city':i.city,
                    'latitude':i.latitude,
                    'longitude':i.longitude,
                    'pin_code':i.pin_code,
                    'isd_code':i.isd_code,
                    'phone_number':i.phone_number,
                    'user':i.user_id,
                    'is_default':i.is_default,

                }
                allData.append(alldata)
            return Response({'status_code':status.HTTP_200_OK,'status_message':'Success','data':allData})
        except Exception as e:
            print(e)
            return Response({'status_code':status.HTTP_500_INTERNAL_SERVER_ERROR,'status_message':str(e)},status=status.HTTP_500_INTERNAL_SERVER_ERROR)

    def post(self,request):
        try:
            session_token=request.META.get('HTTP_AUTHORIZATION')
            if not session_token:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'session_token is required'})
            try:
                user_obj=User.objects.get(token=session_token)
            except Exception as e:
                return Response({'status_code':status.HTTP_401_UNAUTHORIZED,'status_message':'Invalid session token'},status=status.HTTP_401_UNAUTHORIZED)
            serializer = AddAddressSerializer(data=request.data)
            if serializer.is_valid():
                address_obj = Addresses.objects.filter(user_id=user_obj.id,is_default=True).first()
                if address_obj:
                    address_obj.is_default = False
                    address_obj.save()
                print('country',request.data.get('country'))
                print('state',request.data.get('state'))
                print('city',request.data.get('city'))
                Addresses.objects.create(
                    address_label=request.data.get('address_label'),
                    name = request.data.get('name'),
                    address_line = request.data.get('address_line'),
                    country = request.data.get('country'),
                    state = request.data.get('state'),
                    city = request.data.get('city'),
                    latitude = request.data.get('latitude'),
                    longitude = request.data.get('longitude'),
                    pin_code = request.data.get('pin_code'),
                    isd_code = request.data.get('isd_code'),
                    phone_number = request.data.get('phone_number').lstrip('0'),
                    user = user_obj,
                    is_default = True,
                    )
                addres_obj =  Addresses.objects.filter(user_id = user_obj.id)
                allData = []
                for i in addres_obj:
                    alldata = {
                        'id':i.id,
                        'address_label':i.address_label,
                        'name':i.name,
                        'address_line':i.address_line,
                        'country':i.country,
                        'state':i.state,
                        'city':i.city,
                        'latitude':i.latitude,
                        'longitude':i.longitude,
                        'pin_code':i.pin_code,
                        'isd_code':i.isd_code,
                        'phone_number':i.phone_number,
                        'user':i.user_id,
                        'is_default':i.is_default,

                    }
                    allData.append(alldata)
                return Response({'status_code':status.HTTP_200_OK,'status_message':'Address added successfully','data':allData})
            else:
                default_errors = serializer.errors
                new_error = {}
                for field_name, field_errors in default_errors.items():
                    new_error = field_errors
                    break
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':new_error})
        except Exception as e:
            print(e)
            return Response({'status_code':status.HTTP_500_INTERNAL_SERVER_ERROR,'status_message':str(e)},status=status.HTTP_500_INTERNAL_SERVER_ERROR)

class setDefaultAddress(APIView):
    def post(self,request):
        try:
            session_token=request.META.get('HTTP_AUTHORIZATION')
            if not session_token:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'session_token is required'})
            try:
                user_obj=User.objects.get(token=session_token)
            except Exception as e:
                return Response({'status_code':status.HTTP_401_UNAUTHORIZED,'status_message':'Invalid session token'},status=status.HTTP_401_UNAUTHORIZED)
            address_id = request.data.get('address_id')
            if not address_id:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Address Id is required'},status=status.HTTP_400_BAD_REQUEST)
            Address_obj = Addresses.objects.filter(user_id=user_obj.id,is_default=True).first()
            if Address_obj:
                Address_obj.is_default = False
                Address_obj.save()
            Addresses.objects.filter(id=address_id,user_id=user_obj.id).update(is_default=True)
            addres_obj =  Addresses.objects.filter(user_id = user_obj.id)
            allData = []
            for i in addres_obj:
                    alldata = {
                        'id':i.id,
                        'address_label':i.address_label,
                        'name':i.name,
                        'address_line':i.address_line,
                        'country':i.country,
                        'state':i.state,
                        'city':i.city,
                        'latitude':i.latitude,
                        'longitude':i.longitude,
                        'pin_code':i.pin_code,
                        'isd_code':i.isd_code,
                        'phone_number':i.phone_number,
                        'user':i.user_id,
                        'is_default':i.is_default,

                    }
                    allData.append(alldata)
            return Response({'status_code':status.HTTP_200_OK,'status_message':'Default address set successfully','data':allData})
        except Exception as e:
            print(e)
            return Response({'status_code':status.HTTP_500_INTERNAL_SERVER_ERROR,'status_message':str(e)},status=status.HTTP_500_INTERNAL_SERVER_ERROR)

class editAddresses(APIView):
    def post(self,request):
        try:
            session_token=request.META.get('HTTP_AUTHORIZATION')
            if not session_token:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'session_token is required'})
            try:
                user_obj=User.objects.get(token=session_token)
            except Exception as e:
                return Response({'status_code':status.HTTP_401_UNAUTHORIZED,'status_message':'Invalid session token'},status=status.HTTP_401_UNAUTHORIZED)
            address_id = request.data.get('address_id')
            if not address_id:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Address Id is required'})
            serializer = AddAddressSerializer(data=request.data)
            if serializer.is_valid():
                address_post_id = Addresses.objects.filter(id=address_id).first()
                if address_post_id:
                    address_post_id.address_label=request.data.get('address_label')
                    address_post_id.name = request.data.get('name')
                    address_post_id.address_line = request.data.get('address_line')
                    address_post_id.country = request.data.get('country')
                    address_post_id.state = request.data.get('state')
                    address_post_id.city = request.data.get('city')
                    address_post_id.latitude = request.data.get('latitude')
                    address_post_id.longitude = request.data.get('longitude')
                    address_post_id.pin_code = request.data.get('pin_code')
                    address_post_id.isd_code = request.data.get('isd_code')
                    address_post_id.phone_number = request.data.get('phone_number').lstrip('0')
                    address_post_id.user = user_obj
                    address_post_id.save()
                else:
                    return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'No address found'},status=status.HTTP_400_BAD_REQUEST)
                addres_obj =  Addresses.objects.filter(user_id = user_obj.id)
                allData = []
                for i in addres_obj:
                    alldata = {
                        'id':i.id,
                        'address_label':i.address_label,
                        'name':i.name,
                        'address_line':i.address_line,
                        'country':i.country,
                        'state':i.state,
                        'city':i.city,
                        'latitude':i.latitude,
                        'longitude':i.longitude,
                        'pin_code':i.pin_code,
                        'isd_code':i.isd_code,
                        'phone_number':i.phone_number,
                        'user':i.user_id,
                        'is_default':i.is_default,

                    }
                    allData.append(alldata)
                return Response({'status_code':status.HTTP_200_OK,'status_message':'Address edit successfully','data':allData})
            else:
                default_errors = serializer.errors
                new_error = {}
                for field_name, field_errors in default_errors.items():
                    new_error = field_errors
                    break
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':new_error})

        except Exception as e:
            print(e)
            return Response({'status_code':status.HTTP_500_INTERNAL_SERVER_ERROR,'status_message':str(e)},status=status.HTTP_500_INTERNAL_SERVER_ERROR)


class deleteAddress(APIView):
    def post(self,request):
        try:
            session_token=request.META.get('HTTP_AUTHORIZATION')
            if not session_token:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'session_token is required'})
            try:
                user_obj=User.objects.get(token=session_token)
            except Exception as e:
                return Response({'status_code':status.HTTP_401_UNAUTHORIZED,'status_message':'Invalid session token'},status=status.HTTP_401_UNAUTHORIZED)
            address_id = request.data.get('address_id')
            if not address_id:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Address Id is required'},status=status.HTTP_400_BAD_REQUEST)
            Addresses.objects.filter(id=address_id,user_id=user_obj.id).delete()
            addres_obj =  Addresses.objects.filter(user_id = user_obj.id)
            allData = []
            for i in addres_obj:
                    alldata = {
                        'id':i.id,
                        'address_label':i.address_label,
                        'name':i.name,
                        'address_line':i.address_line,
                        'country':i.country,
                        'state':i.state,
                        'city':i.city,
                        'latitude':i.latitude,
                        'longitude':i.longitude,
                        'pin_code':i.pin_code,
                        'isd_code':i.isd_code,
                        'phone_number':i.phone_number,
                        'user':i.user_id,
                        'is_default':i.is_default,

                    }
                    allData.append(alldata)
            return Response({'status_code':status.HTTP_200_OK,'status_message':'Address deleted succesfully','data':allData})
        except Exception as e:
            print(e)
            return Response({'status_code':status.HTTP_500_INTERNAL_SERVER_ERROR,'status_message':str(e)},status=status.HTTP_500_INTERNAL_SERVER_ERROR)

class resetPassword(APIView):
    def post(self,request):
        session_token=request.META.get('HTTP_AUTHORIZATION')
        if not session_token:
            if not request.GET('session_token'):
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'session_token is required'})
            session_token=request.GET['session_token']
        else:
            session_token = session_token.replace("Token ", "")
        try:
            customerObj=User.objects.filter(token=session_token).first()
        except Exception as e:
            return Response({'status_code':status.HTTP_401_UNAUTHORIZED,'status_message':'Invalid session token'},status=status.HTTP_401_UNAUTHORIZED)
        serializer = ResetPasswordSerializer(data=request.data)
        if serializer.is_valid():
            user         = User.objects.get(email=customerObj.email)
            if user.check_password(request.data.get("old_password")) == False:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Does not match with the old password'},status=status.HTTP_400_BAD_REQUEST)
            if user.check_password(request.data.get("confirm_password")) == True:
                    return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'You cannot set new password same as old password'},status=status.HTTP_400_BAD_REQUEST)
            password = request.data.get("confirm_password")
            customerObj.set_password(password)
            customerObj.save()
            return Response({'status_code':status.HTTP_200_OK,'status_message':'Successfully Password Changed','data':''}) 
        else:
            default_errors = serializer.errors
            new_error = {}
            for field_name, field_errors in default_errors.items():
                new_error = field_errors
                break
            return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':new_error})


class loginPanel(APIView):
    def post(self,request):
        serializer    = loginSerializer(data=request.data)
        if serializer.is_valid():
            user  = User.objects.filter(isd_code=request.data.get('isd_code'),phone_number =request.data.get('phone_number').lstrip('0')).count()
            if user == 0:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'This phone number does not exist in our database, please register'},status=status.HTTP_400_BAD_REQUEST)
            userObj  = User.objects.filter(isd_code=request.data.get('isd_code'),phone_number =request.data.get('phone_number').lstrip('0')).first()
            buyer_obj =  Buyer.objects.filter(user_id = userObj.id).first()
            new_pass = userObj.password
            check = handler.verify(request.data.get('password'),new_pass)
            if check:
                allData={'id':userObj.id,
                    'email':userObj.email,
                    'dob':buyer_obj.dob,
                    'isd_code':userObj.isd_code,
                    'phone_number':userObj.phone_number,
                    'first_name':buyer_obj.first_name,
                    'last_name':buyer_obj.last_name,
                    'avatar':userObj.avatar,
                    'token':userObj.token,
                   }
                userObj.save()
                
                return Response({'status_code':status.HTTP_200_OK,'status_message':'Success','data':allData})
            else:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Invalid password'},status=status.HTTP_400_BAD_REQUEST)
        else:
            default_errors = serializer.errors
            new_error = {}
            for field_name, field_errors in default_errors.items():
                new_error = field_errors
                break
            return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':new_error})


class forgetPassword(APIView):
    def post(self,request):
        serializer = LoginSerializer(data=request.data)
        if serializer.is_valid():
            user_check = User.objects.filter(isd_code = request.data.get('isd_code'),phone_number = request.data.get('phone_number').lstrip('0')).first()
            if not user_check:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'This account does not exists in our database'},status=status.HTTP_400_BAD_REQUEST)
            theotp=random.randrange(1000, 9999, 5)
            user_check.forgot_password_otp=theotp
            user_check.save()
            return Response({'status_code':status.HTTP_200_OK,'status_message':'Success','otp':theotp})
        else:
            default_errors = serializer.errors
            new_error = {}
            for field_name, field_errors in default_errors.items():
                new_error = field_errors
                break
            return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':new_error})


class forgetPasswordVerify(APIView):
    def post(self,request):
        serializer = VerifyOtpSerializer(data=request.data)
        if serializer.is_valid():
            customerObj=User.objects.filter(isd_code=request.data.get('isd_code'),phone_number=request.data.get('phone_number').lstrip('0'),forgot_password_otp=request.data.get('otp'),is_buyer=1).first()
            if customerObj:
                return Response({'status_code':status.HTTP_200_OK,'status_message':'Verified Successfully'})
            else:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Invalid otp'},status=status.HTTP_400_BAD_REQUEST)
        else:
            default_errors = serializer.errors
            new_error = {}
            for field_name, field_errors in default_errors.items():
                new_error = field_errors
                break
            return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':new_error})


class forgetPasswordSet(APIView):
    def post(self,request):
        serializer = ForgetPasswordSerializer(data=request.data)
        if serializer.is_valid():
            customerObj=User.objects.filter(isd_code=request.data.get('isd_code'),phone_number=request.data.get('phone_number').lstrip('0'),is_buyer=1).first()
            new_password = request.data.get('password')
            confirm_password = request.data.get('confirm_password')
            if new_password == confirm_password:
                if customerObj.check_password(new_password) == True:
                    return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'You cannot set new password same as old password'},status=status.HTTP_400_BAD_REQUEST)
                if customerObj:
                    customerObj.set_password(new_password)
                    customerObj.save()
                return Response({'status_code':status.HTTP_200_OK,'status_message':'Password changed successfully'})
            else:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Password and confirm password are not same'},status=status.HTTP_400_BAD_REQUEST)
        else:
            default_errors = serializer.errors
            new_error = {}
            for field_name, field_errors in default_errors.items():
                new_error = field_errors
                break
            return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':new_error})

class forgetResendOtp(APIView):
    def post(self,request):
        serializer = LoginSerializer(data=request.data)
        if serializer.is_valid():
            user_check = User.objects.filter(isd_code = request.data.get('isd_code'),phone_number = request.data.get('phone_number').lstrip('0')).first()
            if not user_check:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'This account does not exists in our database'})
            theotp=random.randrange(1000, 9999, 5)
            user_check.forgot_password_otp=theotp
            user_check.save()
            return Response({'status_code':status.HTTP_200_OK,'status_message':'Otp resend successfully','otp':theotp})
        else:
            return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)