
    ]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    7Gq 01G!]!L>2LRSZR[[ijviww|  ~E  }F  GH||H%H==?DH~d?344DLOJ'*:6w?$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$LLNYq-AA	
KL>>	9 9R#88	9 	QR6  $"3"3
 	?@%  ""  ""!!##!!##	
 "D$5$5$C$CC%..wv.R *		VW">48DE&DKIIK  	@Ar(   c                     t         j                  j                  d|d      j                  t	        d|             j                  d      }|r|j                         S d S )NFT)"driver__assigned_vehicles__on_ride0driver__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	*	  ):""$Ct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(   