
    yi                     >   d dl Z d dlmZ d dlmZ d dlmZ d dlmZmZm	Z	mZ
  e j                  e      ZdZ ee      Zdedee   fd	Zd
 Zd Zdedee   fdZdededefdZdededefdZdedee   fdZdefdZdZdee   fdZefdee   defdZd Zd Zy)    N)Optional)ZoneInfo)timezone)datetimetzinfo	timedeltar   zAmerica/Los_Angelesdtreturnc                     | syt        j                  |       r$t        j                  | t        j                        } | j                  t              S )zX
    Convert datetime to Pacific Time safely.
    If already Pacific, return as-is.
    N)r   is_naive
make_awaredt_timezoneutc
astimezone
PACIFIC_TZr	   s    =/var/www/html/dp2/backend_v2.1/server/utils/timezone_utils.py
to_pacificr      s?    
    [__5==$$    c                  P    t        j                         j                  t              S )z.
    Get the current Pacific time safely.
    )r   nowr   r    r   r   pacific_nowr      s     <<>$$Z00r   c                 L    | y| j                  d      | j                  d      fS )zi
    Format datetime into date and time strings.
    1. Date: "Jan, 15 2026"
    2. Time: "03:30 PM"
    Nz	%b, %d %Yz%I:%M %p)strftimer   s    r   format_datetimer   #   s0     
z 	K 
J r   c                     | sy t        j                  |       r$t        j                  | t        j                        } | j                  t        j                        } | j                  d      j                  dd      S )Nmicroseconds)timespecz+00:00Z)r   r   r   r   r   r   	isoformatreplacer   s    r   	iso_utc_zr#   2   s\      [__5	{	'B<<<0883GGr   dt_strtime_zone_infoc                     	 t        j                  |       }t        j                  |      rt        j
                  ||      }|j                  t        j                        S # t        $ r t        d|        w xY w)zE
    Convert a datetime string to a timezone-aware UTC datetime.
    zInvalid datetime format: )	r   fromisoformat
ValueErrorr   r   r   r   r   r   )r$   r%   r	   s      r   to_utcr)   =   sp    ?##F+   ^4==))  ?4VH=>>?s   A! !A9c                     t        j                  |       rt        j                  | |      } | j                  t        j
                        S N)r   r   r   r   r   r   )r	   r%   s     r   	dt_to_utcr,   L   s5      ^4==))r   c                 P    t        | t              rt        j                  |       S dS )z:
    Convert a datetime string to an ISO 8601 format.
    N)
isinstancestrr   r'   )r$   s    r   dt_str_to_isor0   T   s#    
 .8-D8!!&)N$Nr   c                 :   	 t        j                  |       S # t        $ rz}t        j	                  d|        | j                  dd      j                  dd      j                  dd      j                  dd      }t        j                  |d      cY d }~S d }~ww xY w)	Nzsmart parse first exception amz AMpmz PMAMPMz%A, %B %d, %Y at %I:%M %p)r   r'   r(   loggerwarningr"   strptime)r$   exc
normalizeds      r   smart_parse_datetimer;   \   s    
%%f-- 
5cU;< WT5!WT5!WT5!WT5! 	   '
 	

s    	BA/BBBa  
from utils.timezone_utils import (
    to_utc, dt_str_to_iso,
    tz_info_from_offset,
    smart_parse_datetime,
    dt_to_utc
)

service = None
booking_type = (service or "").strip().lower() or "oil change"

c = smart_parse_datetime("2024-06-14 10:30:00")
d = smart_parse_datetime("2026-01-27T13:00:00")
e = smart_parse_datetime("Wednesday, January 28, 2026 at 8:00am")
print(c)
print(c)
print(e)
c                 r    t        | t              r| S t        | t              rt        j                  |       S y r+   )r.   r   r/   r'   )dt_vals    r   	str_to_dtr>      s/    &(#&#%%f--r   offsetfallback_zonec                     | st        |      S 	 t        |       }t        |dz        }t        t	        |            S # t
        t        f$ r t        |      cY S w xY w)z
    Convert timezone offset string like '-8', '+5.5' to tz-info.
    Falls back to ZoneInfo if offset is missing or invalid.
    i  )seconds)r   floatintr   r   r(   	TypeError)r?   r@   hoursrB   s       r   tz_info_from_offsetrG      s]     &&'fedl#9W566	" '&&'s   -= AAc                 r    t        | j                        }t        j                         j                  |      S )z=
    Returns the current datetime of company's timezone.
    )r   r   r   r   )company
company_tzs     r   get_company_timerK      s+    
 '**+J<<>$$Z00r   c                     t        | d      r| j                  st        j                         S t	        | j                        S )zH
    Returns the current datetime in the active company's timezone.
    active_company)hasattrrM   r   r   rK   )users    r   get_current_company_timerP      s4     4)*$2E2E||~D//00r   )loggingtypingr   zoneinfor   django.utilsr   r   r   r   r   	getLogger__name__r6   DEFAULT_TIME_ZONEr   r   r   r   r/   r#   r)   r,   r0   r;   nr>   rG   rK   rP   r   r   r   <module>rY      s      ! I I 
		8	$) '(
%8 % 2 %1H( Hx} H*3 * *8 **( *F *x *O# O(8"4 O
 
*&(+  +'SM''&11r   