
    #i#
                         S r SSKJr  SSKJrJr  SSKJr  S\S\4S jrS\S\4S	 jr	  SS\
S
-  S\\
   S\S\
S
-  S\4
S jjrS
S.S\\\4   S\S\S\4S jjrg
)z(Common utility functions for HarnessElo.    )Sequence)datedatetime)Anydate_strreturnc                      [         R                  " U S5      R                  5       $ ! [         a  n[        SU  S35      UeSnAff = f)zParse date string in YYYY-MM-DD format.

Args:
    date_str: Date string to parse

Returns:
    Parsed date object

Raises:
    ValueError: If date string is invalid
%Y-%m-%dzInvalid date format 'z', expected YYYY-MM-DDN)r   strptimer   
ValueError)r   es     ?/root/tipsharks/tipsharks-elo-api/packages/core/common/utils.py
parse_dater      sP      :6;;== #H:-CD
	s   $' 
AAAdc                 $    U R                  S5      $ )zcFormat date as YYYY-MM-DD string.

Args:
    d: Date to format

Returns:
    Formatted date string
r
   )strftime)r   s    r   format_dater      s     ::j!!    N
distance_mbucketsmodebucket_sizec                     U c  gUS:X  a#  U(       a  US::  a  gX-  U-  nXC-   S-
  nU SU 3$ [        U5       H%  u  pgX:  d  M  US:X  a  SU 3s  $ XS-
      SU 3s  $    SUS    3$ )	aa  Get distance bucket label for a given distance.

Args:
    distance_m: Distance in meters (can be None)
    buckets: List of bucket thresholds in ascending order
    mode: Bucketing mode ("thresholds" or "fixed")
    bucket_size: Fixed bucket size in meters (required if mode is "fixed")

Returns:
    Bucket label (e.g., "<1700", "1700-2000", ">2400")
unknownfixedr      -<>)	enumerate)r   r   r   r   startendi	thresholds           r   get_distance_bucketr&   (   s    " wkQ.*k9!A%#!'*!Av9+&!A#,q44 + wr{mr   )defaultkeysr'   c                `    U nU H%  n[        U[        5      (       a  XC;  a  Us  $ X4   nM'     U$ )aa  Safely get nested dictionary value.

Args:
    d: Dictionary to query
    *keys: Sequence of keys to traverse
    default: Default value if key path not found

Returns:
    Value at key path or default

Example:
    >>> data = {"a": {"b": {"c": 123}}}
    >>> safe_get(data, "a", "b", "c")
    123
    >>> safe_get(data, "a", "x", "y", default=0)
    0
)
isinstancedict)r   r'   r(   currentkeys        r   safe_getr.   N   s8    $ G'4((C,>N,  Nr   )
thresholdsN)__doc__collections.abcr   r   r   typingr   strr   r   intr&   r+   r.    r   r   <module>r6      s    . $ #   (	"4 	"C 	" "	#d
#c]# # t	#
 	#L <@ S#X s S C r   