�
J?�gF � � � d Z ddlZddlZddlmZ ddlmZmZmZ de deej ej f fd�Z
dej deeeef fd �Zy)
zm
Date Utilities for SafetyCulture MCP Server
This module provides utility functions for working with dates.
� N)�
relativedelta)�Tuple�Union�Optional�time_period�returnc �
� t j j � j dddd�� }d}t j || � }|rl|j � \ }} t j j
|d� }t j j
|d� }|j ddd�� }||fS d }t j || � } | �r| j � \ }
}} t j j
d
|
� d|� �d� }|j � d
v r(t |� }
|
dz dk( r|
dz dk7 s|
dz dk( rdnd}n^i dd�dd�dd�dd�dd�dd�dd�dd�dd�dd�dd�d d�d!d�d"d�d#d�d$d�d%d�ddddddd&��}|j |j � d� }t j j
|� d|� d|� �d� }|j ddd�� }||fS d(}t j || t j � }|sL| j � d)k( s9| j � d*k( s&| j � d+k( s| j � d,k( r�|r|j � \ }}t |� }n$d-}| j � j d� d- }|j � d.v r|t j |�/� z
}||fS |j � d0v r|t j |�1� z
}||fS |j � d2v r|t |�3� z
}||fS |j � d4v r|t |�5� z
}||fS t d6|� �� �d7}t j || t j � }|r�|j � \ }}t |� }|j � d.v r|t j |�/� z
}n~|j � d0v r|t j |�1� z
}nR|j � d2v r|t |�3� z
}n0|j � d4v r|t |�5� z
}nt d6|� �� �|j ddd�� }|j ddd�� }||fS d8}t j || t j � }|r�|j � \ }}t |� }|}|j � d.v r|t j |�/� z
}||fS |j � d0v r|t j |�1� z
}||fS |j � d2v r|t |�3� z
}||fS |j � d4v r|t |�5� z
}||fS t d6|� �� �| j � d9k( r-|j � }|t j |�/� z
}||fS | j � d:k( r|j d-�;� }||fS | j � d<k( r|j d-d-�=� }||fS | j � d>k( s| j � d?k( r|j d-d-�=� }||fS | j � d@k( s| j � dAk( r1|j }|d-z
dBz dBz d-z }|j |d-�=� }||fS t dC| � �� �# t $ r t d| � �� �w xY w# t $ r t d'| � �� �w xY w)Da`
Parse a natural language time period into start and end dates.
Args:
time_period: A string describing a time period (e.g., '3 months', 'last week', '2023-01-01 to 2023-03-31')
Returns:
A tuple containing the start and end dates
Raises:
ValueError: If the time period cannot be parsed
r )�hour�minute�second�microsecondz.(\d{4}-\d{2}-\d{2})\s+to\s+(\d{4}-\d{2}-\d{2})z%Y-%m-%d� �; )r
r r zCould not parse date range: z%([A-Za-z]{3})-([A-Za-z]{3})\s+(\d{4})z01 � z%d %b %Y)�feb�february� �d i� � � �jan� �januaryr r �mar�march�apr� �april�may�jun�june�jul�july�aug�august�sep� september)�oct�october�nov�november�dec�decemberzCould not parse month range: z<last\s+(\d+)\s+(day|days|week|weeks|month|months|year|years)zlast dayz last weekz
last monthz last year� )�day�days)r0 )�week�weeks)r2 )�month�months)r4 )�year�years)r6 zUnsupported time unit: z;(\d+)\s+(day|days|week|weeks|month|months|year|years)\s+agoz5(\d+)\s+(day|days|week|weeks|month|months|year|years)z this weekz
this month)r/ z this year)r3 r/ �ytdzyear to date�qtdzquarter to date� zCould not parse time period: )�datetime�now�replace�re�match�groups�strptime�
ValueError�lower�int�get�
IGNORECASE�split� timedeltar �weekdayr3 )r �today�date_range_pattern�date_range_match� start_str�end_str�
start_date�end_date�month_range_pattern�month_range_match�start_month_str�
end_month_str�year_strr5 �last_day�
days_in_month�last_pattern�
last_match� count_str�unit�count�ago_pattern� ago_match�
point_in_time�simple_pattern�simple_matchrH r3 �quarter_start_months �IC:\Users\zerub\Desktop\Coding\Personal\mcp-python\src\utils\date_utils.py�parse_date_rangerc s� � �
���!�!�#�+�+��1�Q�TU�+�V�E� K���x�x� 2�K�@���-�4�4�6�� �7� K�!�*�*�3�3�I�z�J�J��(�(�1�1�'�:�F�H��'�'�R��2�'�F�H��x�'�'�
C�����!4�k�B���3D�3K�3K�3M�0���� L�!�*�*�3�3�c�/�9J�!�H�:�4V�Xb�c�J��"�"�$�(;�;��8�}��"&��(�a�-�T�C�Z�1�_��s�
�VW��2�_a��
!��2�
!�(�"�
!��2�
!�)�2�
!� �2�
!� '��
!� �2�
!� '��
!�
�2�
!� �2�
!� &�r�
!� �2�
!� &�r�
!� �2�
!� (��
!� �2�
!� +�B�
!� �"��2��2�
!�
� )�,�,�]�-@�-@�-B�B�G���(�(�1�1�X�J�a�
��a�PX�z�2Z�\f�g�H��'�'�R��2�'�F�H��x�'�'� S�L����,��R�]�]�C�J��[�&�&�(�J�6�+�:K�:K�:M�Q\�:\�`k�`q�`q�`s� xD� aD� HS� HY� HY� H[� _j� Hj��(�/�/�1�O�I�t�� �N�E��E��$�$�&�,�,�S�1�!�4�D��:�:�<�?�*���!3�!3��!?�?�J� �5� � � �Z�Z�\�.�
.���!3�!3�%�!@�@�J� �5� � � �Z�Z�\�0�
0���e�!<�<�J� �5� � � �Z�Z�\�.�
.���U�!;�;�J� �5� � � �6�t�f�=�>�>�
Q�K�����k�2�=�=�A�I��#�*�*�,�� �4��I����:�:�<�?�*�!�H�$6�$6�E�$B�B�M�
�Z�Z�\�.�
.�!�H�$6�$6�U�$C�C�M�
�Z�Z�\�0�
0�!�M��$?�?�M�
�Z�Z�\�.�
.�!�M��$>�>�M��6�t�f�=�>�>� #�*�*��!�A�*�F�
� �(�(�b��B�(�G���8�#�#� N�N��8�8�N�K����G�L��&�-�-�/�� �4��I������:�:�<�?�*���!3�!3��!?�?�J� �8�#�#� �Z�Z�\�.�
.���!3�!3�%�!@�@�J� �8�#�#� �Z�Z�\�0�
0���e�!<�<�J� �8�#�#� �Z�Z�\�.�
.���U�!;�;�J� �8�#�#� �6�t�f�=�>�>�
����k�)��-�-�/���X�/�/�W�=�=�
��5� � �����l�*��]�]�q�]�)�
��5� � �����k�)��]�]���]�2�
��5� � � ����e�#�{�'8�'8�':�n�'L��]�]���]�2�
��5� � � ����e�#�{�'8�'8�':�>O�'O����� %�� �a�/�1�4�q�8���]�]�)<�!�]�D�
��5� � � �4�[�M�B�
C�C��[ � K��;�K�=�I�J�J� K��H � L��<�[�M�J�K�K� L�s � AZ'