o
    .j                     @  s~   d Z ddlmZ ddlmZ ddlmZmZ ddlm	Z	 ddl
Z
ddlmZ ddlmZ e	r4dd	lmZ eG d
d dZdS )a(  
JMAP calendar resource object.

Wraps a raw JSCalendar CalendarEvent dict with the same minimal interface
as :class:`caldav.calendarobjectresource.CalendarObjectResource`:
``.id``, ``.parent``, :meth:`get_data`, :meth:`get_icalendar_instance`,
:meth:`edit_icalendar_instance`, and :meth:`save`.
    )annotations)contextmanager)	dataclassfield)TYPE_CHECKINGN)jscal_to_ical)JMAPMethodError)JMAPCalendarc                   @  sr   e Zd ZU dZded< ded< edddddZd	ed
< edddZdddZ	dddZ
edd ZdddZdS )JMAPCalendarObjectuq  Thin wrapper around a raw JSCalendar CalendarEvent dict.

    Stores the server's JSON response as-is.  No JMAP field names are mapped
    to typed attributes — callers work with the dict directly via
    :meth:`get_data`, or convert to iCalendar via :meth:`get_icalendar_instance`.

    Attributes:
        data: Raw JSCalendar CalendarEvent dict as returned by ``CalendarEvent/get``.
        parent: The :class:`~caldav.jmap.objects.calendar.JMAPCalendar` this object
            belongs to, or ``None`` when fetched without a calendar context
            (e.g. via :meth:`~caldav.jmap.client.JMAPClient.get_event`).
    dictdatazJMAPCalendar | NoneparentNF)defaultinitreprcomparezicalendar.Calendar | None_ical_cachereturnstrc                 C  s
   | j d S )zServer-assigned JMAP event ID.idr   self r   X/home/thesage/.local/lib/python3.10/site-packages/caldav/jmap/objects/calendar_object.pyr   /   s   
zJMAPCalendarObject.idc                 C  s   | j S )zDReturn the raw JSCalendar dict as returned by ``CalendarEvent/get``.r   r   r   r   r   get_data4   s   zJMAPCalendarObject.get_dataicalendar.Calendarc                 C  s$   | j du rtjt| j| _ | j S )zReturn an :class:`icalendar.Calendar` for this object.

        The result is cached after the first conversion.  Treat it as
        read-only; use :meth:`edit_icalendar_instance` to make and persist
        changes.
        N)r   	icalendarCalendar	from_icalr   r   r   r   r   r   get_icalendar_instance8   s   
z)JMAPCalendarObject.get_icalendar_instancec                 c  s    |   }|V  dS )a  Borrow an editable :class:`icalendar.Calendar` for this object.

        Yields the cached :class:`icalendar.Calendar` for in-place editing.
        Call :meth:`save` after the ``with`` block to persist changes to the server.

        Note: :meth:`save` is sync-only.  Async-backed calendars cannot use
        this path yet.

        Example::

            with obj.edit_icalendar_instance() as cal:
                cal.subcomponents[0]["SUMMARY"] = vText("New title")
            obj.save()
        N)r    )r   calr   r   r   edit_icalendar_instanceC   s   
z*JMAPCalendarObject.edit_icalendar_instanceNonec                 C  s^   | j du rtddd| j jrtd| jdur| j  nt| j}| j j	
| j| dS )a  Persist changes made via :meth:`edit_icalendar_instance` to the server.

        Serialises the (possibly edited) icalendar object back to an iCalendar
        string and calls ``update_event()`` on the parent calendar's client.

        Raises:
            JMAPMethodError: If no parent calendar is set (``parent`` is ``None``).
            RuntimeError: If called on an async-backed calendar.
        NzN/Az&Cannot save: no parent calendar is set)urlreasonzesave() is not supported for async-backed calendars. Use await parent._client.update_event() directly.)r   r   	_is_asyncRuntimeErrorr   to_icaldecoder   r   _clientupdate_eventr   )r   ical_strr   r   r   saveV   s   


zJMAPCalendarObject.save)r   r   )r   r   )r   r   )r   r#   )__name__
__module____qualname____doc____annotations__r   r   propertyr   r   r    r   r"   r-   r   r   r   r   r
      s   
 


r
   )r1   
__future__r   
contextlibr   dataclassesr   r   typingr   r   caldav.jmap.convertr   caldav.jmap.errorr   caldav.jmap.objects.calendarr	   r
   r   r   r   r   <module>   s    	