o
    t,hqS                     @   s  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mZmZmZ d dlmZ d d	l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 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l)m*Z* d dl+m,Z, d dl+m-Z- d dl+Z+G dd deZ.G dd deZ/G dd deZ0G dd deZ1G dd deZ2G dd  d eZ3G d!d" d"eZ4G d#d$ d$eZ5d%d& Z6d'd( Z7d)d* Z8dS )+    )get_object_or_404render)APIViewexception_handler)Responsestatus)Token   )UsersOTPAddressUserLocation)Shop)CartNotificationStat)	timedelta)timezoneN)AccessToken)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   st   |j d}|r|dd}tjj|d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   filterdeleterandomrandintcreater   r   HTTP_200_OK)selfrequestr   r&   createdr(    r9   8/var/www/html/Testing_prj/Navya-Bakers/accounts/views.pypost    s   

zUserLoginView.postN__name__
__module____qualname____doc__r;   r9   r9   r9   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%   rC   )r&   rC   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)r+   r,   r-   r   nowr   r   r.   r0   order_byfirstr   r   r	   r/   rD   saver   for_userr1   r   r   updater   keystrr   r5   HTTP_400_BAD_REQUESTrM   )r6   r7   r   r(   rC   rD   two_minutes_agor*   r&   tokenr8   access_tokener9   r9   r:   r;   9   sd   


zOTPVerificationView.postNr<   r9   r9   r9   r:   rB   4   rA   rB   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)   r+   r   )r&   r   r   r+   r   r5   )r6   r7   r&   
serializerr9   r9   r:   r,      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r+   partialemailFemail_verifiedr
   z"User profile updated successfully.r\   r   r   zProfile update failed.r   r)   errors)r&   r`   r   r+   is_validvalidated_datar,   rQ   r   r   r5   rc   rV   )r6   r7   r&   	old_emailr]   	new_emailr9   r9   r:   put   s,   
zUserProfileView.putN)r=   r>   r?   r@   r   permission_classesr,   rh   r9   r9   r9   r:   r[   }   s
    r[   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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.rL   r      )hours)user_idexpHS256)	algorithmzverify-email)argszVerify your emailz%Click the link to verify your email: F)fail_silentlyr
   zVerification email sent.)r&   ra   r   r   rV   jwtencoderU   uuidr   rN   r   r   
SECRET_KEYbuild_absolute_urir   r   DEFAULT_FROM_EMAILr`   r5   )r6   r7   r&   rX   verification_linkr9   r9   r:   r;      s2   zSendVerificationEmailView.postN)r=   r>   r?   r@   r   ri   r;   r9   r9   r9   r:   rj      s    rj   c                   @      e Zd Zdd ZdS )VerifyEmailViewc              	   C   s   z#t j|tjdgd}tt|d d}d|_|  t|dddd	W S  t j	y6   t|dd
dd	 Y S  t j
yH   t|dd
dd	 Y S w )Nro   )
algorithmsrm   )ru   Tzemail_verification.htmlr
   zEmail verified successfully.rL   r   zVerification link has expired.zInvalid verification link.)rs   decoder   rv   r   r   ra   rQ   r   ExpiredSignatureErrorInvalidTokenError)r6   r7   rX   payloadr&   r9   r9   r:   r,      s.   zVerifyEmailView.getN)r=   r>   r?   r,   r9   r9   r9   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   r.   r0   r,   )r6   r&   r   r9   r9   r:   
get_object   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!r\   r   zAddress retrieved successfully!)
r   r.   r0   r&   r   r   r+   r   r5   r   )r6   r7   r   rq   kwargs	addressesr]   addressr9   r9   r:   r,      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)r+   r%   r
   zAddress created successfully!r\   r   r   zAddress creation failed.rb   )
r   r+   rd   rQ   r&   r   r   HTTP_201_CREATEDrc   rV   )r6   r7   rq   r   r]   r   r9   r9   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 )
NTr^   r
   zAddress updated successfully!r\   r   r   zAddress update failed.rb   )r   r&   r   r+   rd   rQ   r   r   r5   rc   rV   )r6   r7   r   rq   r   r   r]   r9   r9   r:   rh   +  s$   zAddressDetailView.putc                 O   s*   |  |j|}|  tdddtjdS )Nr
   zAddress deleted successfully!rL   r   )r   r&   r1   r   r   r5   )r6   r7   r   rq   r   r   r9   r9   r:   r1   A  s   zAddressDetailView.delete)N)r=   r>   r?   r@   r   ri   r   r,   r;   rh   r1   r9   r9   r9   r:   r      s    
r   c                   @   rz   )SaveUserLocationViewc                 C   s  |j d}|j d}|j d}|rQ|rQ|jjr"|j}d }nd }|j d}|s0t }t|t|f}tjdd}|	||f}	d }
 }}|	rx|	d d	g }|D ] }d
|d v rc|d }
d|d v rm|d }d|d v rw|d }qWt
jjddd}g }|D ],}|j|jf}|j||dd}|d d d d d d }||jd kr|||f q|jdd d |r|d d nd }|rz,tjj||d}tjj|s|nd |r|nd |d||||
 d| d| dd\}}W n8 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rF|jjnd |jd&d'd(d"S tdd)d d*d"S )+Nlatitude	longitude
address_idrC   'AIzaSyBqLt_zwm0JnJR8Rm29_Lqrs0I5P0CkcYU)rT   r!   r   address_componentsroutetypes	long_namelocalityadministrative_area_level_1F)latitude__isnulllongitude__isnulldriving)originsdestinationsmoderowselementsdistancevaluer'   c                 S   s   | d S )Nr
   r9   )xr9   r9   r:   <lambda>t  s    z+SaveUserLocationView.post.<locals>.<lambda>)idr&   Tz, )r   is_selected_addressr   r   shoplocation_address)rC   r&   defaultszAddress not found.rL     r   )r   r   r   r   r   r   r
   z-Location and nearest shop saved successfully.)r   r   r   rC   r   r   r   r   r)   location   z$Latitude and longitude are required.  )r+   r,   r&   is_authenticatedru   uuid4float
googlemapsClientreverse_geocoder   r.   r0   r   r   distance_matrixdelivery_radiusappendsortr   r   update_or_createDoesNotExistr   r   r   r   r   r   )r6   r7   r   r   r   r&   rC   user_locationgmapsreverse_geocode_resultstreet_name	city_name
state_namer   	componentshops	distancesr   shop_locationresultroad_distancenearest_shopr   r   r8   r9   r9   r:   r;   K  s   



zSaveUserLocationView.postNr=   r>   r?   r;   r9   r9   r9   r:   r   J  r   r   c                   @   rz   )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 )NrC   r%   )flat_nolandmark)r   r   r   rC   r   r   r   r   r
   zLocation fetched successfully.r   r   r   r   z!Location not found for this user.rL   r   zAnonymous ID is required.r   rI   z&Location not found for anonymous user.)r+   r,   r&   r   r   r.   r   r   r   ru   r   r   r   r   r   r   r   r   )r6   r7   rC   r&   r   response_datar9   r9   r:   r;     s   

zFetchUserLocationView.postNr   r9   r9   r9   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   r.   r4   rQ   rM   )OrderNotification_titler   descriptionnotification_datarZ   r9   r9   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   )r+   androidapnsrX   )r   firebase_admin_appsr   Certificateinitialize_appr   Messageorder_IDAndroidConfig
APNSConfigAPNSPayloadApsApsAlertsendrM   )	fcmTokenr   r   r   r   credr)   responserZ   r9   r9   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   r9   r9   r:   initialize_fcm_appN  s   r   )9django.shortcutsr   r   rest_framework.viewsr   r   rest_framework.responser   rest_frameworkr   rest_framework.authtoken.modelsr	   modelsr   r   r   r   shops.modelsr   orders.modelsr   r   datetimer   django.utilsr   r2   rest_framework_simplejwt.tokensr   serializersr   r   rest_framework.permissionsr   rs   ru   r   django.confr   django.core.mailr   django.urlsr   r   r   r   r   rB   r[   rj   r{   r   r   r   r   r   r   r9   r9   r9   r:   <module>   sD    I2*TjGD