o
    ÌÄ.jC  ã                   @  sF   d Z ddlmZ ddlmZmZmZ ddd	„Zddd„Zddd„ZdS )uQ   
Shared datetime and duration utilities for JSCalendar â†” iCalendar conversion.
é    )Úannotations)ÚdateÚdatetimeÚ	timedeltaÚtdr   ÚreturnÚstrc                 C  sÐ   t |  ¡ ƒ}|dk rdnd}t|ƒ}t|dƒ\}}t|dƒ\}}t|dƒ\}}|r.|› dnd}g }	|r<|	 |› d¡ |rF|	 |› d	¡ |rP|	 |› d
¡ |	rYdd |	¡ nd}
||
 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   ú-Ú i€Q 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Úbody© r#   úO/home/thesage/.local/lib/python3.10/site-packages/caldav/jmap/convert/_utils.pyÚ_timedelta_to_duration
   s"   r%   Úduration_strc                 C  sd  |   ¡ }d}| d¡rd}|dd… }n| d¡r|dd… }| d¡s+td| ›ƒ‚|dd… }d } } } }}d	|v rH| d	d¡\}}	n|d
}}	|rod|v r_| dd¡\}
}t|
ƒ}d|v ro| dd¡\}}t|ƒ}|	r¥|	}d|v rƒ| dd¡\}}t|ƒ}d|v r“| dd¡\}}t|ƒ}d|v r¥| dd¡\}}tt|ƒƒ}t|||||d}|| 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   r#   r#   r$   Ú_duration_to_timedelta1   sD   



r:   Údtúdatetime | datec                 C  sF   t | tƒr| jdur|  ¡ 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;   r#   r#   r$   Ú_format_local_dtq   s
   


rB   N)r   r   r   r   )r&   r   r   r   )r;   r<   r   r   )	Ú__doc__Ú
__future__r   r   r   r   r%   r:   rB   r#   r#   r#   r$   Ú<module>   s    

'@