
    =[jd                        d Z ddlZddlmZ ddlmZmZmZmZ ddl	m	Z	m
Z
 ddlmZ ddlmZmZmZmZmZmZmZmZ ddlmZ dd	lmZ dd
lmZ ddlmZ ddlmZ ddl m!Z!  ed          Z" G d d          Z# G d d          Z$ G d d          Z% G d d          Z&e G d d                      Z'e G d d                      Z(e G d d                      Z)e G d d                      Z*e G d d                       Z+e G d! d"                      Z,e G d# d$                      Z-e G d% d&                      Z. G d' d(e          Z/dS ))zCalendar service.    N)
monthrange)asdict	dataclassfieldfields)datetime	timedeltarandint)AnyListLiteralOptionalTypeVarUnioncastoverload)uuid4)Response)get_localzone_name)BaseService)PyiCloudSession)camelcase_to_underscoreTc                       e Zd ZdZdZdZdS )DateFormatszDate format constants.z%Y-%m-%dz%Y%m%dN)__name__
__module____qualname____doc__API_DATE
APPLE_DATE     b/home/thesage/.hermes/hermes-agent/venv/lib/python3.11/site-packages/pyicloud/services/calendar.pyr   r      s          HJJJr$   r   c                   2    e Zd ZdZdZdZdZdZdZdZ	dZ
dZdS )	CalendarDefaultszDefault values for calendars.Untitled
__custom__Eventpersonal    N)r   r   r   r    TITLESYMBOLIC_COLORSUPPORTED_TYPEOBJECT_TYPEORDERSHARE_TITLE
SHARED_URLCOLORr#   r$   r%   r'   r'      s<        ''E!NNKEKJEEEr$   r'   c                       e Zd ZdZdZdZdS )InviteeDefaultsz"Default values for event invitees.zREQ-PARTICIPANTzNEEDS-ACTIONN)r   r   r   r    ROLESTATUSr#   r$   r%   r7   r7   *   s        ,,DFFFr$   r7   c                       e Zd ZdZdZdZdS )AlarmDefaultsz Default values for event alarms.messageFN)r   r   r   r    MESSAGE_TYPEIS_LOCATION_BASEDr#   r$   r%   r;   r;   1   s!        **Lr$   r;   c                   h    e Zd ZU dZdZeed<   dZeed<   dZ	eed<   dZ
eed<   dZeed<   dZeed	<   d
S )AlarmMeasurementz9
    Represents the timing measurement for an alarm.
    Tbeforer   weeksdayshoursminutessecondsN)r   r   r   r    rA   bool__annotations__rB   intrC   rD   rE   rF   r#   r$   r%   r@   r@   8   su           FDE3NNND#MMME3NNNGSGSr$   r@   c                   z    e Zd ZU dZeed<   eed<   ej        Zeed<   ej	        Z
eed<    ee          Zeed<   dS )	
AppleAlarmzr
    Represents an alarm in Apple's Calendar API format.

    This is used in the main payload's Alarm array.
    guidpGuidmessageTypeisLocationBaseddefault_factorymeasurementN)r   r   r   r    strrH   r;   r=   rN   r>   rO   rG   r   r@   rR   r#   r$   r%   rK   rK   F   su           IIIJJJ$1K111);OT;;;$)E:J$K$K$KK!KKKKKr$   rK   c                       e Zd ZU dZeed<   eed<   eed<   eed<   eed<   eed<   eed<   edd
ede	dd fd            Z
dee         fdZdS )AppleDateFormatz
    Apple's 7-element date array format.

    Format: [YYYYMMDD, YYYY, MM, DD, HH, MM, minutes_from_midnight]
    The date_string uses YYYYMMDD format.
    date_stringyearmonthdayhourminuteminutes_from_midnightTdtis_startreturnc           	          |r|j         dz  |j        z   }nd|j         z
  dz  d|j        z
  z   } | |                    t          j                  |j        |j        |j        |j         |j        |          S )z/Convert Python datetime to Apple's date format.<      rV   rW   rX   rY   rZ   r[   r\   )rZ   r[   strftimer   r"   rW   rX   rY   )clsr]   r^   minutes_calcs       r%   from_datetimezAppleDateFormat.from_datetimeh   s      	B7R<")3LLLB."ry.ALsK$:;;(9".
 
 
 	
r$   c                 Z    | j         | j        | j        | j        | j        | j        | j        gS )z(Convert to Apple's expected list format.rc   selfs    r%   to_listzAppleDateFormat.to_listz   s3     IJHIK&
 	
r$   NT)r   r   r   r    rS   rH   rI   classmethodr   rG   rg   listrk   r#   r$   r%   rU   rU   W   s           
IIIJJJ	HHH
IIIKKK
 
x 
4 
CT 
 
 
 [
"

c 

 

 

 

 

 

r$   rU   c                   N    e Zd ZU dZeed<   ej        Zeed<   ej	        Z
eed<   dS )AppleEventInviteez
    Represents an invitee within the Event object in Apple's Calendar API.

    This is the simpler invitee structure used inside the Event.invitees array.
    emailroleinviteeStatusN)r   r   r   r    rS   rH   r7   r8   rr   r9   rs   r#   r$   r%   rp   rp      sM           JJJ$D#$$$(/M3/////r$   rp   c                       e Zd ZU dZeed<   eed<   ej        Zeed<   dZ	e
ed<   dZeed<   ej        Zeed	<   dZeed
<   dZe
ed<   dS )ApplePayloadInviteez
    Represents an invitee in the main payload's Invitee array in Apple's Calendar API.

    This is the more detailed invitee structure used in the top-level Invitee array.
    rL   rM   rr   FisOrganizerr-   rq   rs   
commonNameisMeN)r   r   r   r    rS   rH   r7   r8   rr   rv   rG   rq   r9   rs   rw   rx   r#   r$   r%   ru   ru      s           IIIJJJ$D#$$$KE3OOO(/M3///JD$r$   ru   c                   (   e Zd ZU dZeed<   eed<   eed<   eed<   eed<   eed<   eed<   ee         ed	<   ee         ed
<   ee         ed<   ee         ed<   ee         ed<   ee         ed<   eed<   eed<   eed<   eed<   dZ	eed<   dZ
eed<   dZeed<   dZeed<   dZeed<   dZeed<   dZeed<   dZeed<   dZeed<    ee          Zee         ed<    ee          Zee         ed <    ee          Zee         ed!<   d"Zee         ed#<   d"S )$AppleCalendarEventz
    Represents an event in Apple's Calendar API format.

    This dataclass exactly mirrors the structure expected by Apple's API,
    using the correct camelCase field names and types.
    titletzicondurationallDayrM   rL   	startDateendDatelocalStartDatelocalEndDatecreatedDatelastModifiedDateextendedDetailsAreIncludedrecurrenceExceptionrecurrenceMasterhasAttachmentsFreadOnlytransparentbirthdayIsYearlessBdaybirthdayShowAsCompanyshouldShowJunkUIWhenAppropriater-   locationurldescriptionetagrP   alarmsattachmentsinviteesNchangeRecurring)r   r   r   r    rS   rH   rI   rG   r   r   r   r   r   r   r   r   r   r   r   rn   r   r   r   r   r   r   r#   r$   r%   rz   rz      s          JJJGGG
IIIMMMLLLJJJ
IIICy#YIs)c3i $$$$HdK#(D((("'4''',1#T111HcCMMMKD#NNNd333FDI333"U4888Kc888%555Hd3i555%)OXc])))))r$   rz   c                      e Zd ZU dZeed<   dZeed<    eej	                  Z
eed<    ed           Zeed<   d	Zee         ed
<   d	Zee         ed<    ed          Zeed<   dZeed<   d	Zee         ed<   dZeed<   dZeed<   dZeed<   dZeed<   dZeed<   dZeed<   dZeed<   dZeed<   dZeed<   d	Zee         ed<    ede          Ze e         ed<    ede          Z!e e         ed <    ede"          Z#e"ee$f         ed!<   d3d#Z%d"e&fd$Z'e(d"e"ee)f         fd%            Z*d4d&ed'ed"efd(Z+d5d)ee         d"d	fd*Z,d"efd+Z-	 d6d,ed-ed.ed/ed"ef
d0Z.d1efd2Z/d	S )7EventObjectzC
    An EventObject represents an event in the Apple Calendar.
    pguidz	New Eventr{   rP   
start_datec                  J    t          j                    t          d          z   S )Nra   )rE   )r   todayr	   r#   r$   r%   <lambda>zEventObject.<lambda>   s     0 09R3H3H3H H r$   end_dateNlocal_start_datelocal_end_dateF)initr~   r   r}   change_recurringr-   r|   rL   r   Textended_details_are_includedrecurrence_exceptionrecurrence_masterhas_attachmentsall_dayis_junkr   )r   rQ   r   r   _alarm_metadatar_   c                 8   | j                                         st          d          | j        | j        k    r t          d| j         d| j         d          | j        s| j        | _        | j        s| j        | _        | j        s2t          t                                
                                | _        | j        st                      | _        t          | j                                        | j                                        z
  dz            | _        d S )Nzpguid cannot be emptyzstart_date (z) must be before end_date ()ra   )r   strip
ValueErrorr   r   r   r   rL   rS   r   upperr|   r   rI   	timestampr~   ri   s    r%   __post_init__zEventObject.__post_init__   s   z!! 	64555?dm++[t[[4=[[[  
 $ 	4$(OD!" 	0"&-D y 	-EGG**,,DI w 	+(**DG ]$$&&)B)B)D)DDJ
 
r$   c                    |                      | j                  }|                      | j        d          }| j        r|                      | j                  n|}| j        r|                      | j        d          n|}t          j                    }t          j        |          }|                      |          }|                      |          }g }	| j        r| j        }	g }
| j	        r| j	        }
t          di d| j        d| j        d| j        d| j        d| j        d| j        d| j        d	|d
|d|d|d|d|d| j        d| j        d| j        d| j        d| j        d| j        d| j        pdd|
d|	d| j        S )z
        Convert this EventObject to Apple's API format.

        This method handles the conversion from our internal representation
        to the exact structure expected by Apple's Calendar API.
        Fr{   r|   r}   r~   r   rM   rL   r   r   r   r   r   r   r   r   r   r   r   r   r   r-   r   r   r   r#   )
dt_to_listr   r   r   r   timer   fromtimestampr   r   rz   r{   r|   r}   r~   r   r   rL   r   r   r   r   r   r   r   r   )rj   start_date_listend_date_listlocal_start_listlocal_end_listcurrent_timestamp
current_dtcreated_date_listlast_modified_listinvitees_listalarms_lists              r%   to_apple_eventzEventObject.to_apple_event  sD    //$/::u== $!DOOD1222  	 "DOOD/777 	 !IKK+,=>>
 OOJ77!__Z88#%= 	* MM!#; 	&+K! 
 
 
**
ww
 
 ]]	

 <<
 **
 
 &o
 "M
 ,+
 (
 *)
 0/
 (,'I'I
 !% 9 9
  "33!
"  //#
$ -1LL%
& ]]'
( b)
* ;+
, #]-
. !11/
 	
r$   c                                                       }t          |          }|g g d j        ddgid} j        r" fd j        D             }d |D             |d<    j        r" fd j        D             }d	 |D             |d
<   |S )zBReturns the event data in the format required by Apple's calendar.
CollectionN)rL   ctag)r*   InviteeAlarmClientStatec                     g | ]K}t          |j        t          j        d |                    d          d         t          j        dd           LS )F:r-   )rL   rM   rr   rv   rq   rs   rw   rx   )ru   rL   r7   r8   splitr9   ).0
email_guidrj   s     r%   
<listcomp>z,EventObject.request_data.<locals>.<listcomp>e  sm            $#)(- %$**3//3"1"8!	 	 	     r$   c                 ,    g | ]}t          |          S r#   r   )r   invitees     r%   r   z,EventObject.request_data.<locals>.<listcomp>r  s    OOO7vgOOOr$   r   c                     g | ]T}t          |j        t          j        t          j        j                            |t                                           US ))rL   rM   rN   rO   rR   )rK   rL   r;   r=   r>   r   getr@   )r   
alarm_guidrj   s     r%   r   z,EventObject.request_data.<locals>.<listcomp>u  sp         #) - :$1$C $ 4 8 8"$4$6$6! !    r$   c                 ,    g | ]}t          |          S r#   r   )r   alarms     r%   r   z,EventObject.request_data.<locals>.<listcomp>  s    GGGuVE]]GGGr$   r   )r   r   r   r   r   )rj   apple_event
event_dictdatapayload_inviteespayload_alarmss   `     r%   request_datazEventObject.request_dataU  s     ))++K((
  
DAAB	 
  
 = 	P        #'-      PO>NOOODO; 	H    #'+  N HGGGGDMr$   r]   startc                 b    t                               ||          }|                                S )zf
        Converts python datetime object into a list format used
        by Apple's calendar.
        )r^   )rU   rg   rk   )rj   r]   r   
apple_dates       r%   r   zEventObject.dt_to_list  s.    
 %2222FF
!!###r$   	_inviteesc                 H     |r xj          fd|D             z  c_         dS dS )zI
        Adds a list of emails to invitees in the correct format
        c                 (    g | ]}j          d | S )r   )rL   )r   rq   rj   s     r%   r   z,EventObject.add_invitees.<locals>.<listcomp>  s)    LLL44U44LLLr$   N)r   )rj   r   s   ` r%   add_inviteeszEventObject.add_invitees  sC      	MMMLLLL)LLLLMMMM	M 	Mr$   c                     t          t                                }| j         d| }| j                            |           t          dddddd          | j        |<   |S )zg
        Adds an alarm at the time of the event.
        Returns the alarm GUID for reference.
        r   Fr   rA   rB   rC   rD   rE   rF   rS   r   rL   r   appendr@   r   )rj   r   alarm_full_guids      r%   add_alarm_at_timezEventObject.add_alarm_at_time  so    
 \\
!Y5555?+++0@Aq1
 1
 1
_- r$   rE   rD   rC   rB   c                     t          t                                }| j         d| }| j                            |           t          d||||d          | j        |<   |S )a  
        Adds an alarm before the event.

        Args:
            minutes: Minutes before event
            hours: Hours before event
            days: Days before event
            weeks: Weeks before event

        Returns:
            The alarm GUID for reference.
        r   Tr   r   r   )rj   rE   rD   rC   rB   r   r   s          r%   add_alarm_beforezEventObject.add_alarm_before  sp     \\
!Y5555?+++0@u4ugWX1
 1
 1
_- r$   varc                 $    t          | |d          S )zGet a variableN)getattr)rj   r   s     r%   r   zEventObject.get  s    tS$'''r$   r_   Nrl   N)r   r   r   r   )0r   r   r   r    rS   rH   r{   r   r   r   r   r   r   r   r   r~   rI   r}   r   r|   rL   r   r   rG   r   r   r   r   r   r   rn   r   r   r   dictr   r@   r   rz   r   propertyr   r   r   r   r   r   r   r#   r$   r%   r   r      sP          JJJE3 5@@@J@@@HH  Hh    ,0hx(///)-NHX&---Eu%%%Hc%%%D#MMM&*hsm***BLLLD#NNNHc*.!4...!&$&&&#t###!OT!!!GTGTD(3-%UDAAAHd3iAAA5$???FDI???385D4 4 4OT#//0   
 
 
 
::
 2 :
 :
 :
 :
x -d38n - - - X-^$ $X $d $d $ $ $ $M Mhtn M M M M M3     MN '*69FI	   0(s ( ( ( ( ( (r$   r   c                      e Zd ZU dZej        Zeed<   dZ	eed<   dZ
ee         ed<   ej        Zeed<   ej        Zeed<   ej        Zeed	<   ej        Zeed
<   ej        Zeed<   ej        Zeed<   ej        Zeed<   dZeed<   dZeed<   dZeed<   dZee         ed<   dZ ee         ed<   dZ!ee         ed<   dZ"ee         ed<   dZ#ee         ed<   dZ$ee         ed<   dZ%ee         ed<   dZ&ee         ed<   dZ'ee         ed<   dZ(ee         ed<   dZ)ee         ed<   dZ*ee         ed<   dZ+ee         ed<   dZ,ee         ed <   dZ-ee         ed!<   dZ.ee         ed"<   d'd$Z/d#efd%Z0e1d#e2ee3f         fd&            Z4dS )(CalendarObjectzG
    A CalendarObject represents a calendar in the Apple Calendar.
    r{   r-   rL   N
share_typesymbolic_colorsupported_typeobject_typeshare_title
shared_urlcolororderTr   F	read_onlyenabledignore_event_updatesemail_notificationlast_modified_dateme_as_participantpre_published_urlparticipantsdefer_loadingpublished_urlremove_alarmsignore_alarmsr   remove_todos
is_default	is_familyr   r   r_   c                     | j         s2t          t                                                                | _         | j        s|                                 | _        d S d S r   )rL   rS   r   r   r   gen_random_colorri   s    r%   r   zCalendarObject.__post_init__  sT    y 	-EGG**,,DIz 	1..00DJJJ	1 	1r$   c                 n    dt          dd          dt          dd          dt          dd          dS )z0
        Creates a random rgbhex color.
        #r      02xr
   ri   s    r%   r  zCalendarObject.gen_random_color  s>     S71c??RR3RRWQ__RRRRr$   c                 0    t          |           g ddd}|S )zEReturns the calendar data in the format required by Apple's calendar.F)r   	fullState)r   r   r   )rj   r   s     r%   r   zCalendarObject.request_data  s0     !,, "  
  
 r$   r   )5r   r   r   r    r'   r.   r{   rS   rH   rL   r   r   r/   r   r0   r   r1   r   r3   r   r4   r   r5   r   r2   r   rI   r   rG   r   r   r   r   r   r   r  r  r  r  r  r  r   r  r  r	  r   r   r   r  r   r   r   r   r#   r$   r%   r   r     s          "'E3'''D#NNN $J$$$*9NC999*9NC999'3K333'3K333&1J111!'E3'''!'E3'''*.!4...ItGT*.(3-...(,,,,(,,,,'+x}+++'+x}+++"&L(3-&&&#'M8C='''#'M8C='''#'M8C='''#'M8C='''!%K#%%%"&L(3-&&&!%J%%% $Ix~$$$D(3-D(3-1 1 1 1S# S S S S 	d38n 	 	 	 X	 	 	r$   r   c                   "    e Zd ZdZdededeeef         ddf fdZe	deeef         fd            Z
d	edefd
ZdedefdZd&deeef         fdZedeeeef                  fd            Zeded         deeeef                  fd            Zeded         dee         fd            Z	 d'deed         ed         f         deeeeef                  ee         f         fdZdedeeef         fdZdedeeef         fdZe	 	 	 d(dee         dee         dedeeeef                  fd            Ze	 	 	 	 d)dee         dee         deded         deeeef                  f
d            Ze	 	 	 	 d*dee         dee         deded         dee         f
d            Z	 	 	 	 d)dee         dee         dededeeeeef                  ee         f         f
d Zd'd!edefd"Zd#edeeef         fd$Zd#edeeef         fd%Z xZS )+CalendarServicezO
    The 'Calendar' iCloud service, connects to iCloud and returns events.
    service_rootsessionparamsr_   Nc                     t                                          |||           | j         d| _        | j         d| _        | j         d| _        | j         d| _        | j         d| _        d S )Nz/caz/eventsz/eventdetailz/collectionsz/allcollections)super__init__r  _calendar_endpoint_calendar_refresh_url_calendar_event_detail_url_calendar_collections_url_calendars_url)rj   r  r  r  	__class__s       r%   r  zCalendarService.__init__  s     	w777*.*;'@'@'@-1-D*M*M*M"262I/W/W/W'151H.V.V.V&&*&=#N#N#Nr$   c                    t          j                    }t          |j        |j                  \  }}t          |j        |j        d          }t          |j        |j        |          }t          | j                  }|                    dt                      |	                    t          j                  |	                    t          j                  d           |S )z8Returns the default parameters for the calendar service.   en-us)langusertzr   r   )r   r   r   rW   rX   r   r  updater   rd   r   r!   )rj   r   _days_in_monthfrom_dtto_dtr  s          r%   default_paramszCalendarService.default_params  s     #.**%ej%+>>= JQ
 
 U[-@@dk"",..$--k.BCC >>+*>??	 	
 	
 	
 r$   objc                 ^   t          |d          rqd t          |          D             }ddd}|                                D ]=\  }}|                    |t	          |                    }||v rt          |||           >n+|                                D ]\  }}t          |||           |S )zACreates an object from a dictionary with proper field validation.__dataclass_fields__c                     h | ]	}|j         
S r#   )name)r   fs     r%   	<setcomp>z0CalendarService.obj_from_dict.<locals>.<setcomp>&  s    888qAF888r$   r   r   )rM   r   )hasattrr   itemsr   r   setattr)	rj   r+  _dictvalid_fieldsspecial_mappingsapi_keyvalue
field_namekeys	            r%   obj_from_dictzCalendarService.obj_from_dict#  s    3.// 	)88F3KK888L !3<   
 #(++-- 4 4"2"6"64W==# #
 --CU3334 $kkmm ) )
US%((((
r$   rL   c                 8   d}|                      d          D ]s}t          |t                    r|j        |k    r|j        }nCt          |t
                    r.|                    d          |k    r|                    d          }|r|c S tt          d          )z*Returns the ctag for a given calendar guidNF)as_objsrL   r   zctag not found.)get_calendars
isinstancer   rL   r   r   r   r   )rj   rL   r   cals       r%   get_ctagzCalendarService.get_ctag:  s    "%%e%44 	 	C#~.. '38t3C3CxC&& '3776??d+B+Bwwv *+++r$   c                 `   t          j                    }|p|p|}|j        |j        }}t	          ||          \  }}||,|                    d          }|                    |          }t          | j                  }	|	                    dt                      |
                    t          j                  |
                    t          j                  | j        j        j        d         d         d           | j                            | j        |	          }
|
                                S )	a  
        Refresh the Calendar service and return a fresh event payload.

        Date range semantics:
        - If both 'from_dt' and 'to_dt' are provided, they are respected as-is.
        - If exactly one bound is provided, the missing bound is anchored to the
          same month as the provided bound and expanded to the full month
          (1st..last day of that month).
        - If neither is provided, defaults to the current month.

        Notes:
        - Apple's Calendar API treats 'endDate' as inclusive; events occurring on
          the last day of the month (including all-day and 23:00->00:00 boundary
          events) are returned. See tests in tests/test_calendar.py.
        Nr!  )rY   r"  dsInfodsid)r#  r$  r   r   rE  r  )r   r   rW   rX   r   replacer   r  r%  r   rd   r   r!   r  servicer   r   r  json)rj   r(  r)  r   anchorrW   rX   r&  r'  r  reqs              r%   refresh_clientzCalendarService.refresh_clientG  s     #.**"4e4uk6<e%%
 
=
 ?emnnn++GNN}N55Edk"",..$--k.BCC >>+*>??,1(;FC 	
 	
 	
 (()CF(SSxxzzr$   c                     d S r   r#   ri   s    r%   r?  zCalendarService.get_calendarsp  s    58Sr$   r>  Fc                     d S r   r#   rj   r>  s     r%   r?  zCalendarService.get_calendarss  s    NQcr$   Tc                     d S r   r#   rO  s     r%   r?  zCalendarService.get_calendarsv  s    MPSr$   c                       j         } j                             j        |          }|                                }|d         }|s|r|S  fd|D             S )z4
        Retrieves calendars of this month.
        rF  r   c                 T    g | ]$}                     t                      |          %S r#   )r<  r   )r   rA  rj   s     r%   r   z1CalendarService.get_calendars.<locals>.<listcomp>  s/    OOOc"">#3#3S99OOOr$   )r*  r  r   r  rI  )rj   r>  r  rK  response	calendarss   `     r%   r?  zCalendarService.get_calendarsy  sp     "&!4(()<V(LL88::*2<*@	 	9 	OOOOYOOOOr$   calendarc                     |j         }| j        }| j                            | j         d|j         ||          }|                                S )z8
        Adds a Calendar to the apple calendar.
        /r  rI  )r   r*  r  postr  rL   rI  )rj   rU  r   r  rK  s        r%   add_calendarzCalendarService.add_calendar  s\      (4!%!4))-???? * 
 

 xxzzr$   cal_guidc                     | j         }d|d<   | j                            | j         d| |i           }|                                S )z=
        Removes a Calendar from the apple calendar.
        DELETEmethodOverriderW  rX  )r*  r  rY  r  rI  )rj   r[  r  rK  s       r%   remove_calendarzCalendarService.remove_calendar  s\     "&!4#+ ))-::::6PR * 
 
 xxzzr$   rX   r(  r)  periodc                     d S r   r#   )rj   r(  r)  r`  s       r%   
get_eventszCalendarService.get_events  s	      #sr$   c                     d S r   r#   rj   r(  r)  r`  r>  s        r%   rb  zCalendarService.get_events  s	      #sr$   c                     d S r   r#   rd  s        r%   rb  zCalendarService.get_events  s	      Cr$   c                    t          j                    }|dk    r"|r t          |j        |j        |j                  }|dk    r6|s t          |j        |j        |j                  }|t          d          z   }na|dk    r[|sFt          |j        |j        |j                  t          |                                dz             z
  }|t          d          z   }|                     ||          }|                    dg           }|rg|ret          |          D ]U\  }}	|	                    dd	          }
|
st          d
|	           |                     t          |
          |	          ||<   V|S )zR
        Retrieves events for a given date range, by default, this month.
        rX   rY   r!  )rC   week   r*   rM   r-   z$Event missing required pGuid field: )r   r   rW   rX   rY   r	   weekdayrL  r   	enumerater   r<  r   )rj   r(  r)  r`  r>  r   rS  eventsidxeventr   s              r%   rb  zCalendarService.get_events  s    #.**WW\7='+FFEU?? G"5:u{EIFFiQ////EEv "5:u{EIFF1,J J J  iQ////E#'#6#6w#F#F||GR00 	Lv 	L'// L L
U		'2.. U$%SE%S%STTT"00U1C1CUKKsr$   as_objc                    t          | j                  }|                    dt                      | j        j        j        d         d         d           | j         d| d| }| j                            ||          }|	                                }|d         d         }|r9|r7t          t          |                     t          |	          |                    }|S )
zy
        Fetches a single event's details by specifying a pguid
        (a calendar) and a guid (an event's ID).
        r"  rD  rE  )r#  r$  rE  rW  rF  r*   r   )r   )r   r  r%  r   r  rH  r   r  r   rI  r   r   r<  )	rj   r   rL   rn  r  r   rK  rS  rm  s	            r%   get_event_detailz CalendarService.get_event_detail  s    
 dk"",..,1(;FC 	
 	
 	
 5FFFFFF((V(<<88::!!$ 	e 	!%"";U#;#;#;UCC" "E
 r$   rm  c                    |j         }|                     |j                  |d         d         d         d<   | j        }| j                            | j         d|j         d|j         ||          }|                                S )z.
        Adds an Event to a calendar.
        r   r   r   r   rW  rX  )	r   rB  r   r*  r  rY  r  rL   rI  rj   rm  r   r  rK  s        r%   	add_eventzCalendarService.add_event  s     !7;}}U[7Q7Q]L)!,V4$)))FFEKFF%*FF * 
 

 xxzzr$   c                    |j         }|                     |j                  |d         d         d         d<   i |d<   | j        }d|d<   t	          |dd	          s:|                     |j        |j        d
                              d          |_        |j        |d<   | j	        
                    | j         d|j         d|j         ||          }|                                S )zn
        Removes an Event from a calendar. The calendar's guid corresponds to the EventObject's pGuid
        r   r   r   r   r*   r]  r^  r   NF)rn  ifMatchrW  rX  )r   rB  r   r*  r   rp  rL   r   r   r  rY  r  rI  rr  s        r%   remove_eventzCalendarService.remove_event  s     !7;}}U[7Q7Q]L)!,V4W!%!4#+ ufd++ 	..UZ /  c&kk J "Jy)))FFEKFF%*FF * 
 

 xxzzr$   )NN)F)NNrX   )NNrX   F)NNrX   T) r   r   r   r    rS   r   r   r   r  r   r*  r   r<  rB  rL  r   rn   r?  r   r   r   rZ  r_  r   r   rb  r   rG   rp  rs  rv  __classcell__)r  s   @r%   r  r    s        OO*9OCGS>O	O O O O O O S#X    X, a    .,S ,S , , , ,' '$sCx. ' ' ' 'R 8tDcN3888 X8QWU^QT#s(^8LQQQ XQPWT]PtN7KPPP XP ?DP PWT]GEN:;P	tDcN#T.%99	:P P P P ^ S#X    
 
S#X 
 
 
 
  '+$(	# #(## !# 	#
 
d38n	# # # X#  '+$("'# #(## !# 	#
 # 
d38n	# # # X#  '+$(!%   (#  !  	 
   
k	      X  '+$(# #(## !# 	#
 # 
tDcN#T+%66	7# # # #J D [    4{ tCH~    + $sCx.        r$   r  )0r    r   rU  r   dataclassesr   r   r   r   r   r	   randomr   typingr   r   r   r   r   r   r   r   uuidr   requestsr   tzlocalr   pyicloud.services.baser   pyicloud.sessionr   pyicloud.utilsr   r   r   r'   r7   r;   r@   rK   rU   rp   ru   rz   r   r   r  r#   r$   r%   <module>r     s            8 8 8 8 8 8 8 8 8 8 8 8 ( ( ( ( ( ( ( (       O O O O O O O O O O O O O O O O O O O O             & & & & & & . . . . . . , , , , , , 2 2 2 2 2 2GCLL       
 
 
 
 
 
 
 
               
 
 
 
 
 
 
 
 L L L L L L L L  ,
 ,
 ,
 ,
 ,
 ,
 ,
 ,
^ 0 0 0 0 0 0 0 0        & ,* ,* ,* ,* ,* ,* ,* ,*^ a( a( a( a( a( a( a( a(H : : : : : : : :zc c c c ck c c c c cr$   