o
    Є6iIl                     @   s  d dl Z d dlmZmZ d dlmZmZ d dlmZ d dl	m
Z
 d dlmZ d dlmZ dd	lmZmZmZmZmZ d d
lmZ d dlmZmZmZmZ d dlmZ d dlmZ d dl Z d dl!m"Z" ddl#m$Z$m%Z%m&Z& d dl'm(Z( d dl)Z)d dl*Z*d dl+Z+d dl,m-Z- d dl.m/Z/ d dl0m1Z1 d dl2m3Z3 d dl2m4Z4 d dl2Z2G dd deZ5G dd deZ6G dd deZ7G dd deZ8G dd deZ9G d d! d!eZ:G d"d# d#eZ;G d$d% d%eZ<G d&d' d'eZ=G d(d) d)eZ>G d*d+ d+eZ?d,d- Z@d.d/ ZAd0d1 ZBG d2d3 d3eZCdS )4    N)get_object_or_404render)APIViewexception_handler)Responsestatus)Token)send_otp_via_twilio   )UsersOTPAddressUserLocationReferral)Shop)CartNotificationStatDeletedOrdersOrders)	timedelta)timezone)AccessToken)UserDataSerializerUserProfileSerializerAddressSerializer)IsAuthenticated)settings)	send_mail)reverse)	messaging)credentialsc                   @      e Zd ZdZdd ZdS )UserLoginViewz;
    View for user login (also used for registration).
    c                 C   s   |j d}|r|dd}tjj|dd\}}|r!tjj|d tjj	|d
  tdd}tjj||d	 td
d|dtjdS )Nmobile_number  Customer)phone_number	user_typeuser  i'  )r+   otp_coder   zOTP sent successfully!)r   messageotpr   )datagetreplacer   objectsget_or_creater   creater   filterdeleterandomrandintr   r   HTTP_200_OK)selfrequestr$   r+   createdr-    r>   8/var/www/html/Testing_prj/Navya-Bakers/accounts/views.pypost$   s   

zUserLoginView.postN__name__
__module____qualname____doc__r@   r>   r>   r>   r?   r#          r#   c                   @   r"   )OTPVerificationViewz$
    View for OTP verification.
    c              
   C   s~  z|j d}|j d}|j d}|j d}|r!|dd}t tdd }tjj|||d		d

 }|rtt|d}tjj|d\}	}
||_|  t|}|  |rtjj|d  tjj|d  tjj|dj|d d tjj|dj|d d tdd|	jt|dtjdW S tdddtjdW S  ty } ztddt|dtjdW  Y d }~S d }~ww )Nr$   r   anonymous_id	fcm_tokenr%   r&      )minutes)user__phone_numberr-   created_at__gtez-created_at)r(   r*   rH   )r+   rH   r   zOTP verified successfully!)r   r.   
auth_token	jwt_tokenr   r   zInvalid or expired OTP.r   r.   zAn unexpected error occurred.)r   r.   	Exception)r0   r1   r2   r   nowr   r   r3   r6   order_byfirstr   r   r	   r4   rI   saver   for_userr7   r   r   updater   keystrr   r:   HTTP_400_BAD_REQUESTrR   )r;   r<   r$   r-   rH   rI   two_minutes_agor/   r+   tokenr=   access_tokener>   r>   r?   r@   E   sd   


zOTPVerificationView.postNrA   r>   r>   r>   r?   rG   @   rF   rG   c                   @      e Zd ZegZdd ZdS )GetReferralCodeViewc                 C   sB   z|j j}td|jdW S  tjy    tddddd Y S w )Nr   )r   referral_coder   zReferral code not found.rQ     r   )r+   referralr   rb   r   DoesNotExist)r;   r<   rd   r>   r>   r?   r1      s   

zGetReferralCodeView.getN)rB   rC   rD   r   permission_classesr1   r>   r>   r>   r?   ra      s    ra   c                   @   s&   e Zd ZdZegZdd Zdd ZdS )UserProfileViewz5
    View for getting and updating user profile.
    c                 C   s&   |j }t|}tdd|jdtjdS )Nr   z$User profile retrieved successfully.r   r.   r0   r   )r+   r   r   r0   r   r:   r;   r<   r+   
serializerr>   r>   r?   r1      s   zUserProfileView.getc                 C   s|   |j }|j}t||jdd}| r2|jd|}||kr"d|jd< |  tdd|jdt	j
d	S td
d|jdt	jd	S )NTr0   partialemailFemail_verifiedr   z"User profile updated successfully.rh   r   r   zProfile update failed.r   r.   errors)r+   rm   r   r0   is_validvalidated_datar1   rV   r   r   r:   rp   r[   )r;   r<   r+   	old_emailrj   	new_emailr>   r>   r?   put   s,   
zUserProfileView.putN)rB   rC   rD   rE   r   rf   r1   ru   r>   r>   r>   r?   rg      s
    rg   c                   @   r`   )UserDataViewc                 C   sV   |j }t||jdd}| r|  tdd|jdtjdS tdd|jd	tj	dS )
zUpdate logged-in user dataTrk   r   zUser data updated successfully.rh   r   r   zValidation error.ro   )
r+   r   r0   rq   rV   r   r   r:   rp   r[   ri   r>   r>   r?   r@      s$   	zUserDataView.postN)rB   rC   rD   r   rf   r@   r>   r>   r>   r?   rv      s    rv   c                   @   s   e Zd ZdZegZdd ZdS )SendVerificationEmailViewz*
    View to send verification email.
    c                 C   s   |j }|jrtdddtjdS tjt|jt	
 tdd dtjdd	}ttd
d}| td|gd }tdd| tj|jgdd}tdddtjdS )Nr   zEmail already verified.rQ   r      )hours)user_idexpHS256)	algorithmDOMAINzhttp://localhost/zverify-email)argszVerify your emailz%Click the link to verify your email: F)fail_silentlyr   zVerification email sent.)r+   rn   r   r   r[   jwtencoderZ   uuidr   rS   r   r   
SECRET_KEYgetattrr   r   EMAIL_HOST_USERrm   r:   )r;   r<   r+   r]   domainverification_linkaar>   r>   r?   r@      s0   
	zSendVerificationEmailView.postN)rB   rC   rD   rE   r   rf   r@   r>   r>   r>   r?   rw      s    rw   c                   @      e Zd Zdd ZdS )VerifyEmailViewc              	   C   s   z5t j|tjdgd}z
tt|d d}W n   t|dddd Y W S d	|_|  t|dd
ddW S  t j	yH   t|dddd Y S  t j
yZ   t|dddd Y S w )Nr|   )
algorithmsrz   )r   zemail_verification.htmlr   zVerification link has expired.rQ   Tr   zEmail verified successfully.zInvalid verification link.)r   decoder   r   r   r   r   rn   rV   ExpiredSignatureErrorInvalidTokenError)r;   r<   r]   payloadr+   r>   r>   r?   r1     s<   
zVerifyEmailView.getN)rB   rC   rD   r1   r>   r>   r>   r?   r         r   c                   @   s@   e Zd ZdZegZdd ZdddZdd Zd	d
 Z	dd Z
dS )AddressDetailViewzIView for retrieving, creating, updating, and deleting a specific address.c                 C   s   t jj|dj|dS )Nr*   )pk)r   r3   r6   r1   )r;   r+   r   r>   r>   r?   
get_objectB  s   zAddressDetailView.get_objectNc                 O   sj   |d u rt jj|jd}t|dd}tdd|jdtjdS | 	|j|}t|}tdd|jdtjdS )	Nr*   T)manyr   z!Addresses retrieved successfully!rh   r   zAddress retrieved successfully!)
r   r3   r6   r+   r   r   r0   r   r:   r   )r;   r<   r   r   kwargs	addressesrj   addressr>   r>   r?   r1   E  s&   	zAddressDetailView.getc                 O   sV   t |jd}| r|j|jd}tddt |jdtjdS tdd|jd	tj	dS )
N)r0   r*   r   zAddress created successfully!rh   r   r   zAddress creation failed.ro   )
r   r0   rq   rV   r+   r   r   HTTP_201_CREATEDrp   r[   )r;   r<   r   r   rj   r   r>   r>   r?   r@   ]  s"   zAddressDetailView.postc                 O   s^   |  |j|}t||jdd}| r#|  tdd|jdtjdS tdd|j	d	tj
dS )
NTrk   r   zAddress updated successfully!rh   r   r   zAddress update failed.ro   )r   r+   r   r0   rq   rV   r   r   r:   rp   r[   )r;   r<   r   r   r   r   rj   r>   r>   r?   ru   r  s$   zAddressDetailView.putc                 O   s*   |  |j|}|  tdddtjdS )Nr   zAddress deleted successfully!rQ   r   )r   r+   r7   r   r   r:   )r;   r<   r   r   r   r   r>   r>   r?   r7     s   zAddressDetailView.delete)N)rB   rC   rD   rE   r   rf   r   r1   r@   ru   r7   r>   r>   r>   r?   r   =  s    
r   c                   @   r   )SaveUserLocationViewc                 C   s  |j d}|j d}|j d}|r|r|jjr"|j}d }nd }|j d}|s0t }t|t|f}tjt	j
d}z||}	W n# tyi }
 zt }tddt|
|dd	d
W  Y d }
~
S d }
~
ww d } }}|	r|	d dg }|D ] }d|d v r|d }d|d v r|d }d|d v r|d }q|tjjddd}g }g }|D ]}z]|j|jf}|j||dd}|d d d d }|ddkr||jd|d |d W qd|vr||jd||d W q|d d }||jd  kr	||t|d  f W q ty. }
 zt }||jd!t|
|d" W Y d }
~
qd }
~
ww |jd#d$ d |r@|d d nd }|rK|d d% nd }|rz/tjj||d&}tjj|sa|nd |rg|nd |d'|||| d(| d(| |d)d*\}}W n9 tjy   tdd+d,d-d
 Y S w tjj|s|nd |r|nd |||dd | d(| d(| |d.d*\}}td%d/|j|j|jr|jjnd ||j |j!r|j!j"nd |j#d0|d1d2d
S tdd3d,d4d
S )5Nlatitude	longitude
address_idrH   )rY   r   zReverse geocoding failed.)r   r.   error	tracebacki  r   r&   address_componentsroutetypes	long_namelocalityadministrative_area_level_1F)latitude__isnulllongitude__isnulldriving)originsdestinationsmoderowselementsr   OKzNon-OK status: )shop_idreasonelementdistancez!'distance' key missing in element)r   r   r   
raw_resultvaluer,   zException occurred)r   r   r   r   c                 S   s   | d S )Nr   r>   )xr>   r>   r?   <lambda>  s    z+SaveUserLocationView.post.<locals>.<lambda>r   )idr+   Tz, )r   is_selected_addressr   r   shoplocation_addressr   )rH   r+   defaultszAddress not found.rQ   rc   )r   r   r   r   r   r   r   z-Location and nearest shop saved successfully.)r   r   r   rH   r   r   r   )r   r.   locationshop_errors   z$Latitude and longitude are required.  )$r0   r1   r+   is_authenticatedr   uuid4float
googlemapsClientr   GOOGLE_MAPS_API_KEYreverse_geocoderR   r   
format_excr   rZ   r   r3   r6   r   r   distance_matrixappend	unit_namedelivery_radiussortr   r   update_or_createre   r   r   r   r   r   )r;   r<   r   r   r   r+   rH   user_locationgmapsreverse_geocode_resultr_   tbstreet_name	city_name
state_namer   	componentshops	distancesr   r   shop_locationresultr   road_distancenearest_shopnearest_distancer   r   r=   r>   r>   r?   r@     s  		


zSaveUserLocationView.postNrB   rC   rD   r@   r>   r>   r>   r?   r     r   r   c                   @   r   )AccountDeletec                 C   s   |j jrn|j }|rdz1tjj|j d}|D ] }tjj|j|j|j	|j
|j|j|j|j|j|j|j|jd q|  W n tyY } ztddt|dtjdW  Y d }~S d }~ww tddd	tjdS tdd
d	tjdS tddd	tjdS )N)	user_uuid)order_ID
order_typegrand_totalorder_status
store_uuidpu_uuidcustom_productorder_assigntimeorder_delivered_timecreated_datedescriptionr.   r   z.Something went wrong please contact administer)r   r.   r   r   r   zAccount Deleted SuccessfullyrQ   zBad RequestzUser Not Authenticated)r+   r   r   r3   r6   r   r5   r   r   r   r   r   r   r   r   r   r   r   r.   r7   rR   r   rZ   r   r[   r:   HTTP_403_FORBIDDEN)r;   r<   r+   ordersorderr_   r>   r>   r?   r@   *  s   >&zAccountDelete.postNr   r>   r>   r>   r?   r   )  r   r   c                   @   r   )FetchUserLocationViewc              	   C   s  |j d}|jjrf|j}zEtjj|d}|j|j|jr |jj	nd d |j
|jr+|jjnd |jrB|jr6|jjnd |jr>|jjnd dnd |jd}tdd|ddd	W S  tjye   td
dddd	 Y S w |sqtd
dddd	S zEtjj|d}|j|j|jr|jj	nd ||j
|jr|jjnd |jr|jr|jjnd |jr|jjnd dnd |jd}tdd|ddd	W S  tjy   td
dddd	 Y S w )NrH   r*   )flat_nolandmark)r   r   r   rH   r   r   r   r   r   zLocation fetched successfully.)r   r.   r   r   r   r   z!Location not found for this user.rQ   rc   zAnonymous ID is required.r   rN   z&Location not found for anonymous user.)r0   r1   r+   r   r   r3   r   r   r   r   r   r   r   r   r   r   r   re   )r;   r<   rH   r+   r   response_datar>   r>   r?   r@   @  s   

zFetchUserLocationView.postNr   r>   r>   r>   r?   r   ?  r   r   c              
   C   sJ   zt jj|| ||d}|  W d S  ty$ } zW Y d }~d S d }~ww )N)SendmsgOrderIDsendToDescription)r   r3   r5   rV   rR   )OrderNotification_titler   r   notification_datar_   r>   r>   r?   notification_stat_post  s   
r   c           	      C   sH  t |||| tjs\td}t| tj|||jdtj	ddtj
dditjtjdtj||dd	d
|jiddd| d}zt|}W d S  ty[ } zW Y d }~d S d }~ww tj|||jdtj	ddtj
dditjtjdtj||dd	d
|jiddd| d}zt|}W d S  ty } zW Y d }~d S d }~ww )Nj/var/www/html/Testing_prj/Navya-Bakers/constants/navyabakers-1d955-firebase-adminsdk-fbsvc-d2f9578075.json)titler   orderIDhigh)priorityzapns-priority5c   )r   bodydefaultr   )badgealertsoundcustom_data)aps)headersr   )r0   androidapnsr]   )r   firebase_admin_appsr!   Certificateinitialize_appr    Messager   AndroidConfig
APNSConfigAPNSPayloadApsApsAlertsendrR   )	fcmTokenr   r   r   r   credr.   responser_   r>   r>   r?   send_notification  sT   


r  c                  C   s"   t jstd} t |  d S d S )Nr   )r  r  r!   r  r  )r  r>   r>   r?   initialize_fcm_app  s   r  c                   @   s"   e Zd ZegZdd Zdd ZdS )CheckOptInViewc                 C   s   |j }td|jdtjdS )Nr   )r   opt_inr   )r+   r   r  r   r:   )r;   r<   r+   r>   r>   r?   r1     s   zCheckOptInView.getc                 C   sV   |j }|jd}t|tr!||_|  tdd|jdtj	dS tdddtj
dS )	Nr  r   z#Opt-in status updated successfully.)r   r.   r  r   r   z1Invalid value for opt_in. It should be a boolean.rQ   )r+   r0   r1   
isinstanceboolr  rV   r   r   r:   r[   )r;   r<   r+   r  r>   r>   r?   ru     s$   
	zCheckOptInView.putN)rB   rC   rD   r   rf   r1   ru   r>   r>   r>   r?   r    s    	r  )Dr   django.shortcutsr   r   rest_framework.viewsr   r   rest_framework.responser   rest_frameworkr   rest_framework.authtoken.modelsr	   utils.send_otpr
   modelsr   r   r   r   r   shops.modelsr   orders.modelsr   r   r   r   datetimer   django.utilsr   r8   rest_framework_simplejwt.tokensr   serializersr   r   r   rest_framework.permissionsr   r   r   r   django.confr   django.core.mailr   django.urlsr   r  r    r!   r#   rG   ra   rg   rv   rw   r   r   r   r   r   r   r  r  r  r>   r>   r>   r?   <module>   sR    !J1 -%T GD
