
    `gj                        U d Z ddlZddlZddlmZ ddlmZ ddlmZ  ej                  e	      Z
	 ddlmZ daee   ed<   daee   ed<   d	aeed
<   defdZdedee   fdZdee   fdZddZdefdZy# e$ r	 ddlmZ Y Mw xY w)u  
Timezone-aware clock for Hermes.

Provides a single ``now()`` helper that returns a timezone-aware datetime
based on the user's configured IANA timezone (e.g. ``Asia/Kolkata``).

Resolution order:
  1. ``HERMES_TIMEZONE`` environment variable
  2. ``timezone`` key in ``~/.hermes/config.yaml``
  3. Falls back to the server's local time (``datetime.now().astimezone()``)

Invalid timezone values log a warning and fall back safely — Hermes never
crashes due to a bad timezone string.
    N)datetime)get_config_path)Optional)ZoneInfo
_cached_tz_cached_tz_nameF_cache_resolvedreturnc                  <   t        j                  dd      j                         } | r| S 	 	 ddlm}  |       xs i }rZ	 ddlm} |j                  |      }|j                  d	d      }t        |t               r |j                         r|j                         S y# t
        $ r[ ddl}t               }|j                         r8t        |d      5 }|j                  |      xs i }ddd       n# 1 sw Y   nxY wi }Y w xY w# t
        $ r Y w xY w# t
        $ r Y yw xY w)
zRead the configured IANA timezone string (or empty string).

    This does file I/O when falling through to config.yaml, so callers
    should cache the result rather than calling on every ``now()``.
    HERMES_TIMEZONE r   )read_raw_configNzutf-8)encoding)managed_scopetimezone)osgetenvstriphermes_cli.configr   	Exceptionyamlr   existsopen	safe_load
hermes_clir   apply_managed_overlayget
isinstancestr)tz_envr   cfgr   config_pathfr   tz_cfgs           >/root/.hermes/venv/lib/python3.12/site-packages/hermes_time.py_resolve_timezone_namer&   %   s    YY("-335F

	9!#)rC 4#99#> WWZ,F&#&6<<>||~% -  	)+K!!#+8 2A..+1rC2 2 2 	  
  sj   B D D  AD 4C=C,#	C=,C5	1	C=:D <C==D  	D	D DD 	DDnamec                     | sy	 t        |       S # t        t        f$ r!}t        j	                  d| |       Y d}~yd}~ww xY w)z3Validate and return a ZoneInfo, or None if invalid.Nz=Invalid timezone '%s': %s. Falling back to server local time.)r   KeyErrorr   loggerwarning)r'   excs     r%   _get_zoneinfor-   R   sE    ~i  K#	
 s   
 A ;A c                  P    t         st               at        t              ada t        S )zReturn the user's configured ZoneInfo, or None (meaning server-local).

    Resolved once and cached. Call ``reset_cache()`` after config changes.
    T)r	   r&   r   r-   r        r%   get_timezoner1   `   s$     02"?3
r0   c                      da daday)a&  Clear the cached timezone so the next call re-resolves it.

    Call this after the configured timezone may have changed (e.g. after a
    config edit or ``HERMES_TIMEZONE`` update) to force ``get_timezone()`` /
    ``now()`` to read the new value instead of the value cached at first use.
    NF)r   r   r	   r/   r0   r%   reset_cacher3   m   s     JOOr0   c                      t               } | t        j                  |       S t        j                         j                         S )z
    Return the current time as a timezone-aware datetime.

    If a valid timezone is configured, returns wall-clock time in that zone.
    Otherwise returns the server's local time (via ``astimezone()``).
    )r1   r   now
astimezone)tzs    r%   r5   r5   z   s4     
B	~||B<<>$$&&r0   )r
   N)__doc__loggingr   r   hermes_constantsr   typingr   	getLogger__name__r*   zoneinfor   ImportErrorbackports.zoneinfor   __annotations__r   r   r	   boolr&   r-   r1   r3   r5   r/   r0   r%   <module>rC      s     	  , 			8	$,! "&
HX %!%# % * *Z  2 
hx( 

'X 'A  ,+,s   A7 7BB