
    4Yj	                     p    d Z ddlmZmZmZ ddlZddlmZ dZdZdZ	g d	Z
 G d
 d      Zddedz  ddfdZy)u+   Cliente de integração com a API MyGeotab.    )datetime	timedeltatimezoneN   )configDiagnosticOdometerIdDiagnosticEngineOdometerIdDiagnosticEngineHoursId)         Z   im  c                   V    e Zd ZdZddedz  fdZd Zed        Zd Z	d Z
dd	Zdd
Zy)GeotabClientz
    Por padrao le as credenciais salvas localmente (security.load_geotab_credentials()).
    Um dict `credentials` explicito pode ser passado (usado pelo wizard de setup
    para testar um login antes de salvar).
    Ncredentialsc                      d | _         || _        y N)_api_credentials)selfr   s     GD:\Nextcloud\SISTEMAS WINDOWS\frota-trucks-cliente\app\geotab_client.py__init__zGeotabClient.__init__   s    	'    c                 |    | j                   r| j                   S ddlm} |j                         }|st	        d      |S )Nr   )securityu(   Credenciais do Geotab não configuradas.)r    r   load_geotab_credentialsRuntimeError)r   r   credss      r   _resolve_credentialsz!GeotabClient._resolve_credentials   s<    $$$002IJJr   c                    | j                   t| j                         }t        j                  |d   |d   |j	                  d      xs d |j	                  d      xs d      | _         | j                   j                          | j                   S )Nusernamepassworddatabaseserverzmy.geotab.com)r"   r#   r$   r%   )r   r    mygeotabAPIgetauthenticate)r   r   s     r   apizGeotabClient.api$   sx    99--/E z*z*:.6$yy*=o	DI II""$yyr   c                     | j                   j                  d      }|D cg c]  }|j                  dd      r| c}S c c}w )z@Retorna todos os veiculos (trucks) ativos cadastrados no Geotab.Device
isDisabledF)r*   r(   )r   devicesds      r   get_deviceszGeotabClient.get_devices1   s9    ((,,x("E7a!%%e*D7EEEs   ??c                    t        j                  t        j                        t	        |      z
  j                         }t        j                  t        j                        j                         }| j                  j                  dd|i||d      }i }|D ]0  }|d   d   }|d   }	|j                  |      }
|
	|	|
d   kD  s,|||<   2 |S )N)days
StatusDataid)diagnosticSearchfromDatetoDate)searchdevicedateTime)r   nowr   utcr   	isoformatr*   r(   )r   diagnostic_idwindow_days	from_dateto_dateresultslatest_by_devicerecord	device_idrecord_timecurrents              r   _latest_status_data_all_devicesz,GeotabClient._latest_status_data_all_devices6   s    \\(,,/)2MMXXZ	,,x||,668((,,%)=$9%!  
 Fx(.I ,K&**95G+
0C"C.4 +   r   c                     i }t         D ][  }| j                  ||      }|j                         D ]  \  }}||vs|||<    |:|j                  |j	                               sZ |S  |S )u   
        Busca o valor mais recente de um diagnostico para todos os veiculos,
        expandindo a janela de busca ate encontrar dado (trucks parados/sem sinal
        recente ainda aparecem se tiverem histórico mais antigo).
        )LOOKBACK_WINDOWS_DAYSrH   itemsissubsetkeys)r   r>   expected_device_idsmergedr?   batchrE   rD   s           r   %get_latest_diagnostic_for_all_devicesz2GeotabClient.get_latest_diagnostic_for_all_devicesJ   s{     0K88TE%*[[]!	6F*(.F9% &3 #.3F3O3OPVP[P[P]3^ 1 r   c                    |rt        |      nd}| j                  t        |      }| j                  t        |      }i }t        |j	                               t        |j	                               z  }|D ]^  }|j                  |      }|j                  |      }|r|d   t        j                  z  nd|r|d   nd|r|d   dz  nd|r|d   ndd||<   ` |S )z
        Retorna dict device_id -> {"odometer_miles": float|None, "odometer_date": str|None,
                                    "engine_hours": float|None, "engine_hours_date": str|None}
        Ndatar:   i  )odometer_milesodometer_dateengine_hoursengine_hours_date)setrQ   DIAGNOSTIC_ODOMETERDIAGNOSTIC_ENGINE_HOURSrM   r(   r   METERS_PER_MILE)	r   
device_idsexpectedodometer_data
hours_dataresultrE   
odo_record
hrs_records	            r   #get_odometer_miles_and_engine_hoursz0GeotabClient.get_odometer_miles_and_engine_hoursZ   s    
 '13z?dBBCVX`a??@WYab
++-.Z__5F1GG
#I&**95J#	2JS]:f#58N8N#Ncg;EJ!74?IF!3d!:t?IZ
%;t!F9 $ r   r   )__name__
__module____qualname____doc__dictr   r    propertyr*   r0   rH   rQ   rc    r   r   r   r      sE    (D4K ( 
 
F
 ( r   r   r   returnc                     t        |       S )zLCria uma instancia nova a cada chamada (evita reaproveitar sessao expirada).r   )r   rm   s    r   get_geotab_clientrn   r   s    K00r   r   )rg   r   r   r   r&   r   r   rY   DIAGNOSTIC_ENGINE_ODOMETERrZ   rJ   r   rh   rn   rj   r   r   <module>rp      sT    1 2 2   - 9 3  - _ _D14$; 1. 1r   