o
    3id                     @   s6  d dl mZ d dlmZmZmZ d dl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Zd	efd
dZdefddZdefddZdedefddZdefddZdee fddZdededee dee dee dee dee d ee fd!d"Zd#ed$ed%ed&efd'd(Zd#ed$ed%efd)d*Zd+S ),    )HTTPException)IotDeviceCreateIotDeviceUpdateNearbyDevicesRequest)str_to_objectid)datetime)	ASCENDING
DESCENDING)Optional)ObjectIdiot_devicesid_strc                 C   s2   | rt | ts	dS zt| W S  ty   Y dS w )zKReturn ObjectId if valid 24-hex string, else None (instead of raising 400).N)
isinstancestrr   	Exception)r    r   ?/var/www/html/moveengine/app/v1/services/platform/iotdevices.pysafe_objectid   s   
r   devicec                    s*  |   }t |d< d }|d dkrL|d dt|d i}|rK|d}|d}|d}|d	}|d
}||d< ||d< ||d	< ||d
< n5|d dkr|d dt|d i}|r|d}|d}	|d}
|d}|	|d< |
|d< ||d< ||d< |d |}t|j|d< |S )Ncreated_dateassociated_entity_type	workforce_idassociated_entity_idtag_name
first_name	last_namemobile_numberemail_idvehiclefleets
fleet_nameregistration_number
vin_numberr   id)	dictr   utcnowfind_oner   get
insert_oner   inserted_id)r   dbdatar   entityr   r   r   r   r!   r"   r#   resultr   r   r   create_iot_device_service   s>   








r/   
account_idc                    s<   |t  dt| i}|stdddt|d |d< |S )Nr   i  zIoT Device not found)status_codedetailr$   )COLLECTION_NAMEr'   r   r   r   r0   r+   r   r   r   r   get_iot_device_service?   s   r5   updatec                    st   dd |j dd D }t |d< |t dt| id|iI d H  dd	lm} || I d H  t	| |I d H S )
Nc                 S   s   i | ]\}}||qS r   r   ).0kvr   r   r   
<dictcomp>N   s    z-update_iot_device_service.<locals>.<dictcomp>T)exclude_unsetlast_updatedr   z$setr   )notify_nearby_subscribers)
r%   itemsr   r&   r3   
update_oner   app.v1.sockets.tracking_datar=   r5   )r0   r6   r+   update_datar=   r   r   r   update_iot_device_serviceM   s   
rB   c                    s2   t | |I d H }|t dt| iI d H  |S )Nr   )r5   r3   
delete_oner   r4   r   r   r   delete_iot_device_service[   s   rD   qc                    s   i }|r|dd}	d|	id|	ig|d< |r||d< |r ||d< |s$|r>i }
|r0t |d|
d	< |r:t |d|
d
< |
|d< |t || |}g }|D ]}t|d |d< || qO|t |}||dS )Niz$regexz$options
model_nameinstallation_details$ordevice_typestatus%Y-%m-%d$gte$lter   r   r$   total_countdevices)	r   strptimer3   findskiplimitr   appendcount_documents)rU   rV   rE   rK   rL   	date_fromdate_tor+   filter_queryregex_querydate_filtercursorrR   dtotalr   r   r   list_iot_devices_service`   s2   

ra   rU   rV   rK   rL   rY   rZ   r   c	                 C   sn  i }	|r:| dr|dd  }
|
dd}||	d< n!|dd}d|id|id|id	|id
|id|id|id|ig|	d< |r@||	d< |rF||	d< |rL||	d< |sP|rji }|r\t|d|d< |rft|d|d< ||	d< |d |	| |}g }|D ].}t|d |d< |d}|d}d }t|}|dkr7|r7|d 	d|i}|r6dt|d |d|d|d|d|dd}|d  	d!t|i}|rt|d"}|r|d# 	d|i}|rt|d |d$|d|d	|d
|d|d%|d&d'|d(< t
|d dt|d d)}|D ]}t|d |d< |d= q#||d*< nj|d#kr|r|d# 	d|i}|rd#t|d |d$|d|d	|d
|d|d%|d&d+	}t
|d d#t|d d)}|D ]}t|d |d< |d= q||d*< td, t| td- ||d.< || q{|d |	}||d/S )0N#   rF   rG   r   rH   r!   r   r   r   r"   r#   rI   rJ   rK   rL   r   rM   rN   rO   r   r   r   r$   r   r   r    fleetvehicle_typevehicle_image)typefleet_idr!   r"   re   rL   photoworkforce_vehicle
vehicle_idworkforce_idr   r   ri   
fleet_info)rl   r   r   r   r   rL   ri   rm   workforce_info)r   r   device_list)	rg   rl   r   r   r   r   rL   ri   rm   <related_devicesrelated_devicesrelated_devicesrelated_devicesz<************************************************************mapped_detailsrP   )
startswithr   rS   rT   rU   rV   r   r(   r   r'   listprintrW   rX   )rU   rV   rE   rK   rL   rY   rZ   r   r+   r[   tag_valr\   r]   r^   rR   r_   associated_typeassociated_idmapped_dataoidrd   
wf_vehiclewf_oidr   related_devicesrdr`   r   r   r   %list_iot_devices_with_mapping_serviceJ  s   



















r~   latitude	longitude	radius_km	list_typec                 C   s*  ddi}|dkrd|d< n|dkrd|d< dd|| gdd	d
|d |di}|g}|d  |}g }	|D ]}
t|
d t|
dd|
drOt|
ddnd |
dt|
dd|
d|
dd|
d|
d|
d|
dt|
d	dd d|
dd}d }t|
d}|
d}|dkr|r|d d|i}|rdt|d |d|d|d |dd!}n.|dkr|r|d d|i}|rdt|d |d"|d#|d$|d%|dd&}||d'< |	| q4|d(d)ig}t|d  |}|r|d d) nd}||	d*S )+NrL   activer   r   r   $geoNearPointrg   coordinatesdistance_metersT  neardistanceField	sphericalmaxDistancequeryr   r   r0    user_idr   rK   rI   r<   rH   uuidr      last_locationr$   r0   r   r   r   rK   rI   rL   r<   rH   r   distance_kmr   r    rd   r!   r"   re   rg   rh   r!   r"   re   rL   r   r   r   r   rg   rl   r   r   r   r   rL   rq   $countr`   rP   	aggregater   r(   roundr   r'   rW   rs   )r   r   r   r   r+   base_query_conditionsbase_geo_querypipeliner^   rR   r_   device_inforx   ry   rv   rd   r   count_pipelinecount_resultr`   r   r   r   list_nearby_devices_service  s   





	

r   c                 C   s  dd|| gddddddid	i}|g}|d
  |}g }|D ]}t|d t|dd|dr:t|ddnd |dt|dd|d|dd|d|d|d|dt|ddd d|dd}	d }
t|d}|d}|dkr|r|d d|i}|rdt|d |d|d|d |dd!}
n.|d"kr|r|d" d|i}|rd"t|d |d#|d$|d%|d&|dd'}
|
|	d(< ||	 q|d)d*ig}t|d
  |}|r|d d* nd}||d+S ),Nr   r   r   r   Ti@B rL   r   r   r   r   r0   r   r   r   r   rK   rI   r<   rH   r   r   r   r   r   r   r   r    rd   r!   r"   re   r   r   r   r   r   r   r   rq   r   r`   rP   r   )r   r   r   r+   r   r   r^   rR   r_   r   rx   ry   rv   rd   r   r   r   r`   r   r   r   "list_nearby_devices_service_socket-  sr   




	


r   N)fastapir   !app.v1.models.platform.iotdevicesr   r   r   app.v1.libraries.objectr   r   pymongor   r	   typingr
   bsonr   r3   r   r   r/   r5   rB   rD   ra   intr~   floatr   r   r   r   r   r   <module>   sb    $ k
 

Z