Ë
    à“]f  ã                   ó°   — 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
­ 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Zd„ Zd„ Zed„ «       Zd„ Zy
)é    )Útimezone)Ú	timedelta)ÚDistance)ÚDriverLocationé   )ÚRide)Ú*)Úsync_to_async)ÚDecimalN)ÚValidationError)r   ÚROUND_UPc                 ó  — d}| › d|› �}|› d|› �}d|› d|› d|› �}t        j                  |«      }|j                  «       }	|	d   dk7  rt        |	d   «      ‚t	        t        |	d	   d
   d   d
   d   d   dz  «      «      }
|
S )Nz'AIzaSyAEWPwKw_tv81JSa0x_glii-pz51JCX_PUú,zAhttps://maps.googleapis.com/maps/api/distancematrix/json?origins=z&destinations=z&key=ÚstatusÚOKÚerror_messageÚrowsr   ÚelementsÚdistanceÚvalueiè  )ÚrequestsÚgetÚjsonr   r   Ústr)Úfrom_latitudeÚfrom_longitudeÚto_latitudeÚto_longitudeÚapi_keyÚoriginsÚdestinationsÚendpointÚresponseÚdataÚdistance_in_kms              ú7C:\Users\user\Documents\project_loop\booking\process.pyÚcalculate_distancer'      sÃ   € Ø7€GØ�˜q Ð 0Ð1€GØ!�] ! L >Ð2€LØRÐSZÐR[Ð[iÐjvÐiwÐw|ð  ~Eð  }Fð  G€HÜ�|‰|˜HÓ%€HØ�=‰=‹?€DØˆH�~˜ÒÜ˜d ?Ñ3Ó4Ð4äÜˆD�‰L˜‰O˜JÑ'¨Ñ*¨:Ñ6°wÑ?À$ÑFÓGó€Nð Ðó    c                 óÌ   — 	 t        j                  «       }|j                   | |i |¤Ž«       y # t        $ r, t        j                  «       }t        j                  |«       Y ŒLw xY w)N)ÚasyncioÚget_running_loopÚRuntimeErrorÚnew_event_loopÚset_event_loopÚcreate_task)Ú
async_funcÚargsÚkwargsÚloops       r&   Úsetup_async_tasksr4       s\   € ð%Ü×'Ñ'Ó)ˆð 	×Ñ‘Z Ð0¨Ñ0Õ1øô ò %Ü×%Ñ%Ó'ˆÜ×Ñ˜tÖ$ð%ús   ‚. ®2A#Á"A#c                 ó&  — t        d«       t        j                  «       t        d¬«      z
  }t        d«       || j                  cxk  r|t        d¬«      z   k  �r,n �n(t        d«       t        | j                  | j                  «      }t        d«       t        | j                  j                  | j                  j                  | j                  j                  | j                  j                  «      }|| j                  j                  z  }|j                  t        d«      t        ¬	«      }|| _        || _        | j%                  «        |r:t        d
«       t'        || «       t        d«       d| _        | j%                  «        y y t        d«       y )Nz>Step 1: Adjusting current time to account for potential delaysé   )Úminutesz?Step 2: Checking if the ride time is within the next 15 minutesé   zAStep 3: Finding the nearest available driver for the vehicle typez/Step 4: Calculating distance and estimated farez0.01)ÚroundingzBStep 6: Sending a notification to the driver with the ride detailsz0Step 7: Updating the ride status to 'processing'Ú
processingz0The ride time is not within the next 15 minutes.)Úprintr   Únowr   Ú	ride_timeÚfind_nearest_available_driverÚpickup_locationÚvehicle_typer'   ÚyÚxÚdropoff_locationÚper_km_chargeÚquantizer   r   r   Úestimated_fareÚsaveÚnotify_driver_new_rider   )ÚrideÚadjusted_current_timeÚnearest_driverr   rF   Úrounded_fares         r&   Úprocess_new_riderM   )   sJ  € ä	Ð
JÔKÜ$ŸL™L›N¬Y¸qÔ-AÑAÐä	Ð
KÔLàØ�>‰>ô	9à ¤9°RÔ#8Ñ8÷	9ô 	ÐQÔRÜ6Ø× Ñ  $×"3Ñ"3ó
ˆô 	Ð?Ô@Ü%Ø× Ñ ×"Ñ"Ø× Ñ ×"Ñ"Ø×!Ñ!×#Ñ#Ø×!Ñ!×#Ñ#ó	
ˆð " D×$5Ñ$5×$CÑ$CÑCˆØ%×.Ñ.¬w°v«ÌÐ.ÓRˆØ ˆŒØ*ˆÔØ�	‰	ŒÙÜÐVÔWÜ" >°4Ô8äÐDÔEØ&ˆDŒKØ�I‰I�Kð ô 	Ð@ÕAr(   c                 óÀ   — t         j                  j                  d|d¬«      j                  t	        d| «      ¬«      j                  d«      }|r|j                  «       S d S )NFT)Ú"driver__assigned_vehicles__on_rideÚ0driver__assigned_vehicles__vehicle__vehicle_typeÚ!driver__assigned_vehicles__activeÚlast_known_location)r   r   )r   ÚobjectsÚfilterÚannotater   Úorder_byÚfirst)r?   r@   Úavailable_driverss      r&   r>   r>   O   sd   € ô 	×Ñ×%Ñ%Ø/4Ø=IØ.2ð 	&ó 	
÷
 
‰œ8Ð$9¸?ÓKˆÓ	Lß	‰�*Ó	ð ñ ):Ð×"Ñ"Ó$ÐC¸tÐCr(   )Údjango.utilsr   Údatetimer   Ú&django.contrib.gis.db.models.functionsr   Úaccounts.modelsr   Úmodelsr   ÚnotificationsÚasgiref.syncr
   Údecimalr   r   Úrest_framework.exceptionsr   r   r*   r'   r4   rM   r>   © r(   r&   ú<module>rc      sP   ðÝ !Ý Ý ;Ý *Ý Ü Ý &Ý Û Ý 5ß %Û òò 2ð ñ"Bó ð"BóJDr(   