o
    ?h9:                     @   s*  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 fd d!Z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                    s6   |   }t |d< |t |}t|j|d< |S )Ncreated_dateid)dictr   utcnowCOLLECTION_NAME
insert_oner   inserted_id)r   dbdata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 )N_idi  zIoT Device not found)status_codedetailr   )r   find_oner   r   r   r    r   r   r   r   r   get_iot_device_service   s   r&   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>+   s    z-update_iot_device_service.<locals>.<dictcomp>T)exclude_unsetlast_updatedr!   z$setr   )notify_nearby_subscribers)
r   itemsr   r   r   
update_oner   app.v1.sockets.tracking_datar.   r&   )r    r'   r   update_datar.   r   r   r   update_iot_device_service*   s   
r3   c                    s2   t | |I d H }|t dt| iI d H  |S )Nr!   )r&   r   
delete_oner   r%   r   r   r   delete_iot_device_service8   s   r5   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users)	r   strptimer   findskiplimitr   appendcount_documents)rE   rF   r6   r<   r=   	date_fromdate_tor   filter_queryregex_querydate_filtercursordevicesdtotalr   r   r   list_iot_devices_service=   s2   

rR   rE   rF   r<   r=   rI   rJ   c              
   C   s  i }|r|dd}	d|	id|	ig|d< |r||d< |r||d< |s#|r=i }
|r/t |d|
d	< |r9t |d|
d
< |
|d< |d || |}g }|D ]|}t|d |d< |d}|d}d }t|}|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< |	| qN|d 
|}||dS ) Nr7   r8   r9   r:   r;   r<   r=   r>   r?   r@   r   r   r!   r   associated_entity_typeassociated_entity_idvehiclefleetsfleet
fleet_nameregistration_numbervehicle_typetypefleet_idrX   rY   rZ   r=   	workforce
first_name	last_namemobile_numberemail_idr\   workforce_idr_   r`   ra   rb   r=   mapped_detailsrA   rO   )r   rC   rD   rE   rF   r   getr   r$   rG   rH   )rE   rF   r6   r<   r=   rI   rJ   r   rK   rL   rM   rN   rO   rP   associated_typeassociated_idmapped_dataoidrW   r^   rQ   r   r   r   %list_iot_devices_with_mapping_service   sf   




	

rl   latitude	longitude	radius_kmc                 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 )+N$geoNearPointr\   coordinatesdistance_metersT  r=   activeneardistanceField	sphericalmaxDistancequeryr   r!   r     user_idrS   rT   r<   r:   r-   r9   uuidr      last_locationr   r    r~   rS   rT   r<   r:   r=   r-   r9   r   distance_kmr   rU   rV   rW   rX   rY   rZ   r[   r^   r_   r`   ra   rb   rc   re   $countrQ   rf   	aggregater   rg   roundr   r$   rG   listrm   rn   ro   r   base_geo_querypipelinerN   rO   rP   device_inforj   rk   rh   rW   r^   count_pipelinecount_resultrQ   r   r   r   list_nearby_devices_service   sr   




	


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 ),Nrp   rq   rr   rt   Ti@B r=   rv   rw   r   r!   r    r}   r~   rS   rT   r<   r:   r-   r9   r   r   ru   r   r   r   rU   rV   rW   rX   rY   rZ   r[   r^   r_   r`   ra   rb   rc   re   r   rQ   rf   r   r   r   r   r   "list_nearby_devices_service_socketE  sr   




	


r   N)fastapir   !app.v1.models.platform.iotdevicesr   r   r   app.v1.libraries.objectr   r   pymongor   r	   typingr
   bsonr   r   r   r   r   r&   r3   r5   rR   intrl   floatr   r   r   r   r   r   <module>   sV    	l
M
O