
    iM                    F    d Z ddlmZ ddlmZmZmZmZ ddZdd
ZddZ	dS )uQ   
Shared datetime and duration utilities for JSCalendar ↔ iCalendar conversion.
    )annotations)datedatetime	timedeltatimezonetdr   returnstrc                   t          |                                           }|dk     rdnd}t          |          }t          |d          \  }}t          |d          \  }}t          |d          \  }}|r| dnd}g }	|r|	                    | d           |r|	                    | d	           |r|	                    | d
           |	rdd                    |	          z   nd}
||
z   pd}| d| S )u  Convert a timedelta to an ISO 8601 duration string.

    Examples:
        timedelta(hours=1, minutes=30) → "PT1H30M"
        timedelta(days=1, hours=2)     → "P1DT2H"
        timedelta(0)                   → "P0D"
        timedelta(seconds=-900)        → "-PT15M"

    Args:
        td: The duration to convert.

    Returns:
        ISO 8601 duration string, always positive or negative prefix,
        never fractional components.
    r   - iQ i  <   DHMST0DP)inttotal_secondsabsdivmodappendjoin)r   r   signdaysremhoursminutessecondsday_part
time_parts	time_partbodys               U/root/projects/butler/venv/lib/python3.11/site-packages/caldav/jmap/convert/_utils.py_timedelta_to_durationr'   
   s7     ((**++M!##33D&&M}e,,ID#T""JE3c2GW!)$zzzzrHJ 'U+++&&& )W---((( )W---(((/9Arwwz****rIi'4DT    duration_strc                z   |                                  }d}|                    d          rd}|dd         }n|                    d          r
|dd         }|                    d          st          d|           |dd         }dx}x}x}x}}d	|v r|                    d	d          \  }}	n|d
}	}|rXd|v r(|                    dd          \  }
}t	          |
          }d|v r(|                    dd          \  }}t	          |          }|	r|	}d|v r(|                    dd          \  }}t	          |          }d|v r(|                    dd          \  }}t	          |          }d|v r5|                    dd          \  }}t	          t          |                    }t          |||||          }||z  S )uA  Parse an ISO 8601 duration string into a timedelta.

    Handles the subset used in JSCalendar: P[nW][nD][T[nH][nM][nS]].
    Does not handle months or years (JSCalendar uses recurrenceRules for those).

    Examples:
        "PT1H30M"  → timedelta(hours=1, minutes=30)
        "P1DT2H"   → timedelta(days=1, hours=2)
        "P0D"      → timedelta(0)
        "-PT15M"   → timedelta(seconds=-900)

    Args:
        duration_str: ISO 8601 duration string.

    Returns:
        Equivalent timedelta.

    Raises:
        ValueError: If the string cannot be parsed.
       r   N+r   zInvalid duration string: r   r   r   Wr   r   r   r   )weeksr   r   r    r!   )strip
startswith
ValueErrorsplitr   floatr   )r)   sr   r/   r   r   r    r!   	date_partr$   wd_	remaininghmsec_strr   s                     r&   _duration_to_timedeltar>   1   s    * 	AD||C abbE	
c		 abbE<< GE\EEFFF	!""A/00E0D0507W
axx wwsA	99 "9	 )$??322LAyFFE)??3**DAqq66D 
*	)$??322LAyFFE)$??322LAy!ffG)"a00JGQ%..))G	TQX	Y	Y	YB"9r(   dtdatetime | datec                   t          | t                    rV| j        :|                                 t	          d          k    r|                     d          S |                     d          S |                                  dS )a  Format a datetime or date as a JSCalendar LocalDateTime or UTCDateTime string.

    JSCalendar uses:
      - LocalDateTime: "2024-03-15T09:00:00"    (no TZ suffix)
      - UTCDateTime:   "2024-03-15T09:00:00Z"   (uppercase Z)

    For date objects (all-day), uses T00:00:00 suffix.

    Args:
        dt: A datetime (with or without tzinfo) or a date.

    Returns:
        Formatted string suitable for use as a JSCalendar override key or datetime value.
    Nr   z%Y-%m-%dT%H:%M:%SZz%Y-%m-%dT%H:%M:%Sz	T00:00:00)
isinstancer   tzinfo	utcoffsetr   strftime	isoformat)r?   s    r&   _format_local_dtrG   q   ss     "h 09 R\\^^y||%C%C;;3444{{.///llnn''''r(   N)r   r   r	   r
   )r)   r
   r	   r   )r?   r@   r	   r
   )
__doc__
__future__r   r   r   r   r   r'   r>   rG    r(   r&   <module>rK      s     # " " " " " 8 8 8 8 8 8 8 8 8 8 8 8$ $ $ $N= = = =@( ( ( ( ( (r(   